view mde/setup/initFunctions.d @ 63:66d555da083e

Moved many modules/packages to better reflect usage.
author Diggory Hardy <diggory.hardy@gmail.com>
date Fri, 27 Jun 2008 18:35:33 +0100
parents mde/scheduler/initFunctions.d@5132301e9ed7
children
line wrap: on
line source

/* LICENSE BLOCK
Part of mde: a Modular D game-oriented Engine
Copyright © 2007-2008 Diggory Hardy

This program is free software: you can redistribute it and/or modify it under the terms
of the GNU General Public License as published by the Free Software Foundation, either
version 2 of the License, or (at your option) any later version.

This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
See the GNU General Public License for more details.

You should have received a copy of the GNU General Public License
along with this program.  If not, see <http://www.gnu.org/licenses/>. */

/** This module is responsible for calling all init functions.
*
* It is also responsible for setting up all scheduled functions for now.

* Idea: change import direction so this module adds all init functions. All init functions are
* wrapped in another function before being run in a thread (i.e. run indirectly). Functions fail
* either by throwing an exception or by returning a boolean. Functions may take parameters, e.g.
* "out cleanupFunc[]". */
module mde.setup.initFunctions;

/+ unused
import tango.util.log.Log : Log, Logger;
static this() {
    logger = Log.getLogger ("mde.setup.initFunctions");
}
private Logger logger;
+/

void setInitFailure () {    /// Call to indicate failure in an init function
    initFailure = true;
}

/** Represents all functions to be called for a particular init stage. */
struct InitStage
{
    struct InitFunction {
        void delegate() func;       // the actual function
        char[] name;                // it's name;
    }
    
    /** Add a function to be called during this init stage.
    *
    * Called in order added when not threaded (reverse order for cleanup).
    *
    * Exceptions should never be thrown, since each function may run as a thread, and catching
    * thread exceptions is not guaranteed to work. Log a message, call setFailure() and return
    * instead. */
    void addFunc (void delegate() f, char[] name) {
        InitFunction s;
        s.func = f;
        s.name = name;
        funcs ~= s;
    }
    void addFunc (void function() f, char[] name) { /// ditto
        InitFunction s;
        s.func.funcptr = f;
        s.name = name;
        funcs ~= s;
    }
    
    InitFunction[] funcs = [];
}

InitStage init;     // all functions called during init (all should be thread-safe)
//FIXME: implement:
InitStage save;     // all functions to be called to save data (possible to run more than once)
InitStage cleanup;  // all functions called during cleanup (all should be thread-safe)

package:
bool initFailure = false;   // set on failure (throwing through threads isn't a good idea)