Mercurial > projects > mde
diff mde/scheduler/InitStage.d @ 20:838577503598
Reworked much of Init.
Moved mde.Init to mde.scheduler.Init and largely cleaned up the code.
Implemented mde.scheduler.InitStage to reduce dependancies of modules running Init functions.
committer: Diggory Hardy <diggory.hardy@gmail.com>
author | Diggory Hardy <diggory.hardy@gmail.com> |
---|---|
date | Sat, 22 Mar 2008 16:22:59 +0000 |
parents | |
children | a60cbb7359dd |
line wrap: on
line diff
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/mde/scheduler/InitStage.d Sat Mar 22 16:22:59 2008 +0000 @@ -0,0 +1,89 @@ +/* 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, version 2, as published by the Free Software Foundation. + +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, write to the Free Software Foundation, Inc., +51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA. */ + +/** This module is used to create a list of all functions required to run for initialisation and +* cleanup. +* +* It has been separated out of Init.d to massively reduce dependancies of modules adding init +* functions. +*/ +module mde.scheduler.InitStage; + +/** Represents all functions to be called for a particular init stage. +* +* No code is included here to run the functions intentionally, to keep dependancies minimal. +*/ +struct InitStage +{ + alias void function() InitFunction; /// Alias + + /** 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 (InitFunction f) { + funcs ~= f; + } + + /** Should be called by an init function when a failure occurs. */ + void setFailure () { + synchronized failure = true; + } + + package InitFunction[] funcs = []; + package bool failure = false; +} + +/** Init can be divided up into these stages, each run in order: +* +* init0: +* static this() (not represented here) +* +* init1: +* Also known as pre-init; is where options get loaded by Init (not represented here). +* +* init2: +* Main symbol and config loading and general low-level stage. This stage is threaded, so all +* called functions need to be thread-safe. +* +* init3: +* Reserved as an unthreaded stage. +* +* init4: +* Main loading stage for data files and setup for higher-level elements, e.g. windows and input +* devices. This stage is threaded, so all called functions need to be thread-safe. +* +* cleanupX: +* Corresponding cleanup stage to initX. Called in reverse order (e.g. cleanup2 called before +* cleanup1). Cleanup is never threaded. +* +* The following functions get called (update list as appropriate): +* +* init2: +* mde.SDL.initSdlAndGl, mde.events.initInput +* +* init4: +* mde.SDL.setupWindow +* +* cleanup2: +* (Potentially): mde.SDL.cleanupSDL, mde.init.joystick.closeJoysticks +*/ +InitStage init2; +InitStage init4; /// ditto +InitStage cleanup2; /// ditto +InitStage cleanup4; /// ditto