Release / Reload of modules --------------------------- The 'not active' modules are unloaded after startup Plugins should be allowed to be unloaded and reloaded on the fly Modules too, when possible? Don't want to 'force' all plugins to have unload capabilities Just has to be something specified at compile time wether or not they can unload 'cleanly' Dependency implications. When you release a module, you need to remove a number of interfaces. If those interfaces are being used, can you explicitely ask for them to be unloaded? Also, problem with plugins breaking the startup process: http://zerowing.idsoftware.com/bugzilla/show_bug.cgi?id=441 The most important is to provide a clean shutdown method What's the != between unload and shutdown? Means that the server proceeds to the shutdown, and nothing else is supposed to be making calls through APIs post shutdown. Should be done in 3 steps: #1 prepare shutdown, all APIs are active, just release and save all the stuff you want #2 tell the modules to shutdown, i.e. release the APIs they point to? (at this point they can't call through anymore) #3 force all things to be unloaded, warn about reference count problems What is different when we unload a module, and we want to keep the editor up? All the interfaces obtained from this plugin need to be released If some pure virtual classes have been obtained from this plugin, we need a mecanism to have them removed Do we need a first path to check if the unload procedure is going to be allowed? For instance, a plugin that provides custom entities rendering etc. Need to unload first, then need to reload (scan the map again, rebuild) Summing up, when doing a reload we need to keep track of the modules and let them know after the module has been reloaded, so that the links can be rebuilt. When doing unload we need to do a 'check' pass prior to anything to know if the release is possible. Because it does not depend on the module we unload, it depends on the other clients that use it. Objectives: ----------- - 'release check' of a module walk through the interfaces this module has provided, and make sure the release will be possible - 'release' of a module actually drop all the interfaces. this should be done only after a 'release check' if something fails here, we are in an unstable state and need to abort - 'client shutdown' unused modules after initial startup actual DLL unload / complete shutdown of the client interface this comes after 'release check' and 'release' - 'refresh' modules 'release check', 'release', 'shutdown' and then, reload and build the links again - 'core shutdown' 'release' and force 'shutdown' of all clients even if we encounter some interfaces that we are not able to release cleanly force things and shutdown all clients then the core process is ready to exit.. Constraints: ------------ - refresh and shutdown are sharing some code - the 'release' part of a module refresh may not be always possible (that's what 'release check' is there for) - 'core shutdown' has to be forced to happen, in the safest way possible obviously Implementation: --------------- - 'client shutdown' comes first this is used after initial startup, since we don't have to do a prior 'release' on those this will be used in the 'core shutdown' and 'refresh' too - then 'core shutdown' procedure? that's the most urgent thing we need but 'release check' and 'release' have to be written in and used during 'core shutdown' - 'refresh' takes an essential part of the design, but that's not something we need to have written right now? (it mostly relies on 'release check' 'release' 'client shutdown', and then reload and rebuild the links) 'client shutdown': this is server side code though, you tell the server 'shutdown this client' we don't have to exchange anything with the client while we do that (written initially for unload of unused modules after startup) 'core shutdown': is a shutdown of all clients