annotate mde/setup/Init.d @ 88:01f4f5f1acc9

Changes to init and to allow compiling with gdc. Tweaked init code to allow using circular iterators (disabled until my patch makes it into tango). Changes to allow compiling with gdc. Building is successful and unittests complete, but in my experience a SIGSEGV occurs within SDL.
author Diggory Hardy <diggory.hardy@gmail.com>
date Mon, 29 Sep 2008 12:09:44 +0100
parents 79d816b3e2d2
children 97e6dce08037
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
1 /* LICENSE BLOCK
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
2 Part of mde: a Modular D game-oriented Engine
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
3 Copyright © 2007-2008 Diggory Hardy
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
4
26
611f7b9063c6 Changed the licensing and removed a few dead files.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 25
diff changeset
5 This program is free software: you can redistribute it and/or modify it under the terms
611f7b9063c6 Changed the licensing and removed a few dead files.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 25
diff changeset
6 of the GNU General Public License as published by the Free Software Foundation, either
611f7b9063c6 Changed the licensing and removed a few dead files.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 25
diff changeset
7 version 2 of the License, or (at your option) any later version.
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
8
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
9 This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY;
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
10 without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
11 See the GNU General Public License for more details.
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
12
26
611f7b9063c6 Changed the licensing and removed a few dead files.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 25
diff changeset
13 You should have received a copy of the GNU General Public License
611f7b9063c6 Changed the licensing and removed a few dead files.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 25
diff changeset
14 along with this program. If not, see <http://www.gnu.org/licenses/>. */
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
15
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
16 /**************************************************************************************************
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
17 * Initialisation and cleanup (shutdown) module.
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
18 *
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
19 * Program startup follows this sequence: static this() functions, pre-init, init.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
20 * Shutdown consists of: cleanup, post-cleanup, static ~this() functions.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
21 *
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
22 * static this and ~this functions should not use any external resources, such as dynamically
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
23 * loaded libraries or files, and should not interact with other modules. They should be almost
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
24 * guaranteed not to fail. Preferably, they shouldn't involve large amounts of memory or
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
25 * processing, but this is not a requirement.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
26 *
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
27 * Pre-init: init code written in this module. Generally only prerequisets of most other stages
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
28 * go here.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
29 *
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
30 * Init: This is where init code from external modules gets hooked in. Each stage consists of an
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
31 * initialization function, a corresponding cleanup function, a state, and any dependencies (other
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
32 * init functions which must be run before this one). Init functions are run according to these
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
33 * dependencies, potentially threaded simultaeneously with other init functions.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
34 *
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
35 * Cleanup: Cleanup happens similarly to init for all stages requiring shutdown (according to their
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
36 * state). The init dependencies are applied in reverse order (so if X depended on Y, Y's cleanup
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
37 * will not run until X's cleanup has completed), and again the functions may be threaded.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
38 *
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
39 * Post-cleanup: like pre-init, this is code written in Init.
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
40 *************************************************************************************************/
63
66d555da083e Moved many modules/packages to better reflect usage.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 56
diff changeset
41 module mde.setup.Init;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
42
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
43 import mde.setup.InitStage; // Controls external delegates run by init
63
66d555da083e Moved many modules/packages to better reflect usage.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 56
diff changeset
44 import mde.setup.exception;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
45
63
66d555da083e Moved many modules/packages to better reflect usage.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 56
diff changeset
46 import mde.lookup.Options;
66d555da083e Moved many modules/packages to better reflect usage.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 56
diff changeset
47 import paths = mde.setup.paths;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
48 import mde.exception; // optionsLoadException
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
49
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
50 // tango imports
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
51 import tango.core.Thread;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
52 import tango.core.sync.Condition;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
53 import tango.core.Exception;
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
54 import tango.util.container.CircularList;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
55
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
56 //import tango.stdc.stringz : fromStringz;
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
57 import tango.io.Console; // for printing command-line usage
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
58 import TimeStamp = tango.text.convert.TimeStamp, tango.time.WallClock; // output date in log file
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
59 import tango.util.Arguments;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
60 import tango.util.log.Log;
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
61 import tango.util.log.AppendConsole;
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
62 import tango.util.log.AppendFiles;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
63
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
64 // Derelict imports
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
65 import derelict.opengl.gl;
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
66 import derelict.sdl.sdl;
56
f9f5e04f20b2 Bit of polish for a public release, including some more documentation.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 55
diff changeset
67 //import derelict.sdl.image; Was to be used... for now isn't
30
467c74d4804d Major changes to the scheduler, previously only used by the main loop.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 29
diff changeset
68 import derelict.freetype.ft;
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
69 import derelict.util.exception;
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
70
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
71
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
72 /**************************************************************************************************
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
73 * Init class
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
74 *
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
75 * A scope class created at beginning of the program and destroyed at the end; thus the CTOR
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
76 * handles program initialisation and the DTOR handles program cleanup.
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
77 *************************************************************************************************/
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
78 scope class Init
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
79 {
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
80 static this() {
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
81 // Set up the logger temporarily (until pre-init):
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
82 Logger root = Log.root;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
83 debug root.level(Logger.Trace);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
84 else root.level(Logger.Info);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
85 root.add(new AppendConsole);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
86
63
66d555da083e Moved many modules/packages to better reflect usage.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 56
diff changeset
87 logger = Log.getLogger ("mde.setup.Init");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
88 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
89
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
90 /** this() − pre-init and init */
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
91 this(char[][] cmdArgs)
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
92 {
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
93 /******************************************************************************************
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
94 * Pre-init - init code written in this module.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
95 *****************************************************************************************/
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
96 debug logger.trace ("Init: starting pre-init");
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
97 //FIXME: warn on invalid arguments, including base-path on non-Windows
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
98 // But Arguments doesn't support this (in tango 0.99.6 and in r3563).
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
99 Arguments args;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
100 try {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
101 args = new Arguments();
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
102 args.define("base-path").parameters(1);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
103 args.define("data-path").parameters(1,-1);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
104 args.define("conf-path").parameters(1,-1);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
105 args.define("paths");
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
106 args.define("q").aliases(["quick-exit"]);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
107 args.define("help").aliases(["h"]);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
108 args.parse(cmdArgs);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
109 if (args.contains("help")) // lazy way to print help
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
110 throw new InitException ("Help requested"); // and stop
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
111 } catch (Exception e) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
112 printUsage(cmdArgs[0]);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
113 throw new InitException ("Parsing arguments failed: "~e.msg);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
114 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
115
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
116 // Find/create paths:
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
117 try {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
118 if (args.contains("data-path"))
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
119 paths.extraDataPath = args["data-path"];
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
120 if (args.contains("conf-path"))
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
121 paths.extraConfPath = args["conf-path"];
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
122 if (args.contains("base-path"))
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
123 paths.resolvePaths (args["base-path"]);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
124 else
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
125 paths.resolvePaths();
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
126 } catch (Exception e) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
127 throw new InitException ("Resolving paths failed: " ~ e.msg);
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
128 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
129 if (args.contains("paths")) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
130 paths.mdeDirectory.printPaths;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
131 throw new InitException ("Paths requested"); // lazy way to stop
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
132 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
133 debug logger.trace ("Init: resolved paths successfully");
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
134
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
135 /* Load options now. Don't load in a thread since:
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
136 * Loading should be fast & most work is probably disk access
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
137 * It enables logging to be controlled by options
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
138 * It's a really good idea to let the options apply to all other loading */
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
139 try {
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
140 Options.load();
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
141 } catch (optionsLoadException e) {
25
2c28ee04a4ed Some minor and some futile efforts.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 24
diff changeset
142 throw new InitException ("Loading options failed: " ~ e.msg);
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
143 }
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
144 debug logger.trace ("Init: loaded options successfully");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
145
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
146 // Set up the logger:
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
147 Logger root;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
148 try {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
149 enum LOG {
55
f3d8c0441408 Implemented gl.texture (without testing) & fixed log options adjusted previously.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 53
diff changeset
150 LEVEL = 0xF, // mask for log level
f3d8c0441408 Implemented gl.texture (without testing) & fixed log options adjusted previously.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 53
diff changeset
151 CONSOLE = 0x1000, // log to console?
f3d8c0441408 Implemented gl.texture (without testing) & fixed log options adjusted previously.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 53
diff changeset
152 ROLLFILE= 0x2000 // use Rolling/Switching File Appender?
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
153 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
154
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
155 // Where logging is done to is determined at compile-time, currently just via static ifs.
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
156 root = Log.root;
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
157 root.clear; // we may no longer want to log to the console
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
158
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
159 // Now re-set the logging level, using the value from the config file:
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
160 root.level (cast(Level) (miscOpts.logOptions & LOG.LEVEL), true);
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
161
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
162 // Log to a file (first appender so root seperator messages don't show on console):
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
163 if (miscOpts.logOptions & LOG.ROLLFILE) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
164 // Use 2 log files with a maximum size of 1 MB:
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
165 root.add (new AppendFiles (paths.logDir~"/log-.txt", 2, 1024*1024));
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
166 root.info (""); // some kind of separation between runs
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
167 root.info ("");
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
168 } else if (!(miscOpts.logOptions & LOG.CONSOLE)) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
169 // make sure at least one logger is enabled
64
cc3763817b8a Overhauled Options so that it now uses templates and mixins for type-specific internals, and supported types can be adjusted via just one list.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 63
diff changeset
170 miscOpts.set!(int) ("logOptions", miscOpts.logOptions | LOG.CONSOLE);
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
171 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
172 if (miscOpts.logOptions & LOG.CONSOLE) { // Log to the console
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
173 root.add(new AppendConsole);
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
174 }
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
175 logger.info ("Starting mde [no version] on " ~ TimeStamp.toString(WallClock.now));
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
176 } catch (Exception e) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
177 // Presumably it was only adding a file appender which failed; set up a new console
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
178 // logger and if that fails let the exception kill the program.
67
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
179 root.clear;
108d123238c0 Changes to work with tango r3700 (post 0.99.6).
Diggory Hardy <diggory.hardy@gmail.com>
parents: 64
diff changeset
180 root.add (new AppendConsole);
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
181 logger.warn ("Exception while setting up the logger; logging to the console instead.");
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
182 }
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
183
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
184 // a debugging option:
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
185 imde.run = !args.contains("q") && !miscOpts.exitImmediately;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
186 debug logger.trace ("Init: applied pre-init options");
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
187
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
188 //BEGIN Load dynamic libraries
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
189 /* Can be done by init functions but much neater to do here.
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
190 * Also means that init functions aren't run if a library fails to load. */
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
191 try {
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
192 DerelictSDL.load();
56
f9f5e04f20b2 Bit of polish for a public release, including some more documentation.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 55
diff changeset
193 // SDLImage was going to be used... for now it isn't because of gl texturing problems
f9f5e04f20b2 Bit of polish for a public release, including some more documentation.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 55
diff changeset
194 //DerelictSDLImage.load();
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
195 DerelictGL.load();
30
467c74d4804d Major changes to the scheduler, previously only used by the main loop.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 29
diff changeset
196 DerelictFT.load();
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
197 } catch (DerelictException de) {
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
198 logger.fatal ("Loading dynamic library failed:");
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
199 logger.fatal (de.msg);
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
200
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
201 throw new InitException ("Loading dynamic libraries failed (see above).");
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
202 }
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
203 debug logger.trace ("Init: dynamic libraries loaded");
29
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
204 //END Load dynamic libraries
f985c28c0ec9 A new GUI widget plus changes to the init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 28
diff changeset
205
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
206
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
207 /******************************************************************************************
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
208 * Init − where init code from external modules gets hooked in.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
209 *****************************************************************************************/
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
210 debug logger.trace ("Init: done pre-init, starting init stages");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
211
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
212 // Calculate reverse dependencies of stages:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
213 foreach (key,stage_p; stages)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
214 foreach (name; stage_p.depends)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
215 stages[name].rdepends ~= key;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
216 if (miscOpts.numThreads < 1 || miscOpts.numThreads > 64) // limit to a sensible number of threads
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
217 miscOpts.set!(int)("numThreads", 4); // FIXME enforce limit in Options
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
218
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
219 runStages!(true); // startup delegates
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
220
24
32eff0e01c05 Only locally-changed options are stored in user-config now. Log levels revised.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 21
diff changeset
221 debug logger.trace ("Init: done");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
222 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
223
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
224 /** DTOR - runs cleanup functions. */
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
225 ~this()
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
226 {
24
32eff0e01c05 Only locally-changed options are stored in user-config now. Log levels revised.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 21
diff changeset
227 debug logger.trace ("Cleanup: starting");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
228
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
229 runStages!(false); // cleanup delegates
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
230
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
231 Options.save(); // save options... do so here for now
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
232
24
32eff0e01c05 Only locally-changed options are stored in user-config now. Log levels revised.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 21
diff changeset
233 debug logger.trace ("Cleanup: done");
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
234 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
235
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
236 // run init stages or cleanup if startup is false
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
237 private static void runStages(bool startup) () {
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
238 CircularList!(InitStage*) toRun = new CircularList!(InitStage*);
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
239 foreach (v; stages) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
240 // Filter only stages with the relevant delegate. It is not checked later that the
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
241 // delegate exists!
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
242 // If no init/cleanup function exists, implicit activation/deactivation can occur so
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
243 // that dependents/dependencies may activate/deactivate.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
244 static if (startup) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
245 if (v.state == StageState.INACTIVE) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
246 if ((*v).init)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
247 toRun.append (v);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
248 else
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
249 v.state = StageState.ACTIVE;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
250 }
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
251 } else {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
252 if (v.state == StageState.ACTIVE) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
253 if (v.cleanup)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
254 toRun.append (v);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
255 else
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
256 v.state = StageState.INACTIVE;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
257 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
258 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
259 }
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
260 auto toRunIt = toRun.iterator;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
261 int numWorking = miscOpts.numThreads;
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
262 enum STATE { WORKING = 0, DONE = 1, ABORT = 2 }
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
263 STATE doneInit = STATE.WORKING;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
264 Mutex toRunM = new Mutex; // synchronization on toRun, numWorking
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
265 Condition toRunC = new Condition(toRunM); // used by threads waiting for remaining stages' dependencies to be met
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
266
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
267 /* This is a threadable member function to run init stages.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
268 * Operation follows:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
269 * 1 Look for a stage to run:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
270 * if found:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
271 * notify waiting threads work may be available
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
272 * init stage
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
273 * goto 1
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
274 * if not found:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
275 * if any other threads are working, wait (dependencies may not be met yet)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
276 * if no other threads are working, notify waiting threads and terminate (finished)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
277 * When notified, threads start at 1. */
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
278 void initThreadFct () {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
279 try { // created as a thread - must not throw exceptions
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
280 InitStage* stage;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
281
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
282 threadLoop:
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
283 while (true) { // thread loops until a problem occurs or nothing else can be done
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
284 // Look for a job:
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
285 synchronized (toRunM) {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
286 --numWorking; // stopped working: looking/waiting for a job
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
287 if (doneInit) break threadLoop; // something went wrong in another thread
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
288
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
289 static if (startup)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
290 int num_rdepends = (stage is null) ? 0 : stage.rdepends.length;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
291 else
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
292 int num_rdepends = (stage is null) ? 0 : stage.depends.length;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
293
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
294 getStage:
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
295 while (true) {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
296 static if (false) // An addition to CircularList to allow continuous circular iteration; not yet in tango.
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
297 toRunIt.start; // start circling from here
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
298 else
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
299 toRunIt = toRun.iterator; // new iterator
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
300 itStages:
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
301 while (toRunIt.next (stage)) { // get next element of toRun
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
302 debug logger.trace ("Iterating: {}", stage);
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
303 static if (startup) {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
304 foreach (d; stage.depends)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
305 if (stages[d].state != StageState.ACTIVE)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
306 continue itStages; // dependency isn't met (yet)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
307 } else {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
308 foreach (d; stage.rdepends)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
309 if (stages[d].state != StageState.INACTIVE)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
310 continue itStages; // reverse dependency isn't unmet (yet)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
311 }
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
312
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
313 // All dependencies met
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
314 debug assert (toRun.size, "toRun is empty (error with iterator)");
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
315 toRunIt.remove;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
316 break getStage;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
317 }
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
318
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
319 // No stage remaining with all dependencies met
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
320 if (toRun.size && numWorking) // still some working so more dependencies may be met later
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
321 toRunC.wait; // wait until another thread finishes
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
322 else // no thread is working, so none of what's left is doable, or nothing's left
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
323 break threadLoop;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
324 }
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
325 ++numWorking; // got a job!
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
326 if (num_rdepends > 2) // how many stages depended on the last one run?
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
327 toRunC.notifyAll(); // tell all waiting threads there may be work now
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
328 else if (num_rdepends == 2)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
329 toRunC.notify(); // there's potentially work for this thread and one other
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
330 // else there won't be additional work so don't notify
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
331 }
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
332
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
333 // Do a job:
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
334 try {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
335 // FIXME - old stage start&finish trace messages - we don't have a name!
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
336 debug logger.trace ("InitStage {}: starting", stage);
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
337 static if (startup)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
338 stage.state = (*stage).init(); // init is a property of a pointer (oh no!)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
339 else
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
340 stage.state = stage.cleanup();
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
341 debug logger.trace ("InitStage {}: completed; state: {}", stage, stage.state);
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
342 } catch (InitStageException e) {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
343 debug logger.trace ("InitStage {}: failed", stage);
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
344 stage.state = e.state;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
345 doneInit = STATE.ABORT;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
346 break threadLoop;
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
347 } catch (Exception e) {
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
348 debug logger.trace ("InitStage {}: failed", stage);
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
349 doneInit = STATE.ABORT;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
350 break threadLoop;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
351 }
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
352 }
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
353 } catch (Exception e) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
354 logger.fatal ("Exception in initThreadFct: "~e.msg);
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
355 doneInit = STATE.ABORT;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
356 }
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
357 doneInit |= STATE.DONE; // allow other threads a faster exit
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
358 toRunC.notifyAll(); // Most likely if we're exiting, we should make sure others aren't waiting.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
359 return;
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
360 }
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
361
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
362 // Start miscOpts.NumThreads - 1 threads:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
363 try {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
364 ThreadGroup g = new ThreadGroup;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
365 for (int i = miscOpts.numThreads; i > 1; --i)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
366 g.create (&initThreadFct);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
367 initThreadFct(); // also run in current thread
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
368 g.joinAll (false); // don't rethrow exceptions - there SHOULD NOT be any
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
369 } catch (ThreadException e) {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
370 logger.error ("Exception while using threads: "~e.msg);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
371 logger.error ("Disabling threads and attempting to continue.");
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
372 miscOpts.set!(int)("NumThreads", 1); // count includes current thread
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
373 initThreadFct(); // try with just this thread
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
374 } // any other exception will be caught in main() and abort program
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
375
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
376 if (doneInit & STATE.ABORT)
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
377 throw new InitException ("An init/cleanup function failed (see above message(s))");
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
378
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
379 if (toRun.size)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
380 foreach (stage; toRun)
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
381 logger.warn ("InitStage {}: was not run due to unmet dependencies", stage);
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
382 }
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
383
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
384 private static {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
385 Logger logger;
53
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
386
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
387 void printUsage (char[] progName) {
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
388 Cout ("mde [no version]").newline;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
389 Cout ("Usage:").newline;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
390 Cout (progName ~ ` [options]`).newline;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
391 version(Windows)
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
392 Cout (
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
393 ` --base-path path Use path as the base (install) path (Windows only). It
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
394 should contain the "data" directory.`).newline;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
395 Cout (
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
396 ` --data-path path(s) Add path(s) as a potential location for data files.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
397 First path argument becomes the preffered location to
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
398 load data files from.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
399 --conf-path path(s) Add path(s) as a potential location for config files.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
400 Configuration in the first path given take highest
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
401 priority.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
402 --paths Print all paths found and exit.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
403 --quick-exit, -q Exit immediately, without entering main loop.
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
404 --help, -h Print this message.`).newline;
f000d6cd0f74 Changes to paths, command line arguments and font LCD rendering.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 45
diff changeset
405 }
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
406 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
407
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
408 debug (mdeUnitTest) unittest {
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
409 auto realInit = stages; // backup the real init stages
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
410 stages = new typeof(stages); // an empty test-bed
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
411
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
412 bool init1, init2, init3 = true;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
413 StageState s1InitReturns = StageState.ACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
414 addInitStage ("stg1", delegate StageState() {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
415 init1 = true;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
416 return s1InitReturns;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
417 }, delegate StageState() {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
418 init1 = false;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
419 return StageState.INACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
420 });
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
421 addInitStage ("stg2", delegate StageState() {
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
422 assert (init1);
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
423 init2 = true;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
424 return StageState.ACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
425 }, delegate StageState() {
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
426 assert (init1);
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
427 init2 = false;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
428 return StageState.INACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
429 }, ["stg1"]);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
430 InitStage s3;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
431 s3.init = delegate StageState() {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
432 throw new InitStageException (cast(StageState)7); // not a normal state, but good for a test
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
433 return StageState.ERROR;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
434 };
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
435 s3.cleanup = delegate StageState() {
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
436 assert (init1);
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
437 init3 = false;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
438 return StageState.INACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
439 };
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
440 s3.depends = [ toStageName("stg1") ];
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
441 s3.state = StageState.ACTIVE; // already active, so s3.init should not run (first time)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
442 addInitStage ("stg3", &s3);
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
443
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
444 // Stuff normally done in Init.this():
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
445 // Calculate reverse dependencies of stages:
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
446 foreach (key,stage_p; stages)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
447 foreach (name; stage_p.depends)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
448 stages[name].rdepends ~= key;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
449 if (miscOpts.numThreads < 1 || miscOpts.numThreads > 64) // limit to a sensible number of threads
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
450 miscOpts.set!(int)("numThreads", 4); // FIXME enforce limit in Options
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
451
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
452
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
453 // Run the above.
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
454 runStages!(true);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
455 assert (init1);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
456 assert (init2);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
457 foreach (s; stages)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
458 assert (s.state == StageState.ACTIVE);
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
459
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
460 runStages!(false);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
461 assert (!init1);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
462 assert (!init2);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
463 assert (!init3);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
464 foreach (s; stages)
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
465 assert (s.state == StageState.INACTIVE);
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
466
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
467 s1InitReturns = StageState.ERROR;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
468 // Run again. S2/S3 shouldn't run, S1 won't shut down
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
469 runStages!(true);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
470 assert (init1);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
471 assert (!init2);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
472 assert (!init3);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
473 runStages!(false);
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
474 assert (init1); // S1 cleanup won't run
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
475
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
476 stages[toStageName("stg1")].state = StageState.INACTIVE; // hack it back so we can still test
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
477 s1InitReturns = StageState.ACTIVE;
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
478 init1 = false;
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
479 bool a1 = false;
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
480 try {
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
481 runStages!(true);
88
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
482 a1 = true;
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
483 } catch (Exception e) {}
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
484 assert (!a1, "runStages didn't throw");
01f4f5f1acc9 Changes to init and to allow compiling with gdc.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 86
diff changeset
485 assert (init1); // s1.init should run first; s2.init may or may not get run
85
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
486 assert (stages[toStageName("stg3")].state == cast(StageState)7); // set by the exception
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
487
56c0ddd90193 Intermediate commit (not stable). Changes to init system.
Diggory Hardy <diggory.hardy@gmail.com>
parents: 77
diff changeset
488 stages = realInit; // restore the real init stages
20
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
489 logger.info ("Unittest complete.");
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
490 }
838577503598 Reworked much of Init.
Diggory Hardy <diggory.hardy@gmail.com>
parents:
diff changeset
491 }