Skip to content

Commit

Permalink
#5231: Statically registered modules are now lazy-instantiating the m…
Browse files Browse the repository at this point in the history
…odule types right before submitting them to the ModuleRegistry, giving the application enough time to set up the infrastructure.

Remove ModuleList from About dialog.
  • Loading branch information
codereader committed Apr 29, 2020
1 parent 4f9a655 commit 1d7e354
Show file tree
Hide file tree
Showing 21 changed files with 82 additions and 602 deletions.
533 changes: 22 additions & 511 deletions install/ui/aboutdialog.fbp

Large diffs are not rendered by default.

23 changes: 3 additions & 20 deletions install/ui/aboutdialog.xrc
Expand Up @@ -142,25 +142,6 @@
<value></value>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxBOTTOM|wxTOP</flag>
<border>6</border>
<object class="wxStaticText" name="AboutDialogHeader4">
<label>DarkRadiant Modules</label>
<wrap>-1</wrap>
</object>
</object>
<object class="sizeritem">
<option>0</option>
<flag>wxEXPAND|wxLEFT</flag>
<border>12</border>
<object class="wxTextCtrl" name="AboutDialogDarkRadiantModules">
<style>wxTE_MULTILINE|wxTE_READONLY|wxTE_WORDWRAP</style>
<size>-1,70</size>
<value></value>
</object>
</object>
</object>
</object>
<object class="sizeritem">
Expand All @@ -170,8 +151,10 @@
<object class="wxButton" name="AboutDialogOkButton">
<label>OK</label>
<default>0</default>
<markup>0</markup>
<bitmap />
</object>
</object>
</object>
</object>
</resource>
</resource>
4 changes: 4 additions & 0 deletions radiant/RadiantApp.cpp
Expand Up @@ -7,6 +7,7 @@
#include "log/PIDFile.h"
#include "modulesystem/ModuleRegistry.h"
#include "module/CoreModule.h"
#include "modulesystem/StaticModule.h"

#include <wx/wxprec.h>
#include <wx/event.h>
Expand Down Expand Up @@ -149,6 +150,9 @@ void RadiantApp::onStartupEvent(wxCommandEvent& ev)
ui::Splash::OnAppStartup();
#endif

// Pick up all the statically defined modules and register them
module::internal::StaticModuleList::RegisterModules();

try
{
module::GlobalModuleRegistry().loadAndInitialiseModules();
Expand Down
4 changes: 3 additions & 1 deletion radiant/RadiantModule.cpp
Expand Up @@ -129,7 +129,9 @@ module::StaticModule<RadiantModule> radiantCoreModule;
// Return the static Radiant module to other code within the main binary
RadiantModulePtr getGlobalRadiant()
{
return radiantCoreModule.getModule();
return std::static_pointer_cast<RadiantModule>(
module::GlobalModuleRegistry().getModule(MODULE_RADIANT)
);
}

} // namespace radiant
Expand Down
4 changes: 3 additions & 1 deletion radiant/brush/BrushModule.cpp
Expand Up @@ -157,5 +157,7 @@ module::StaticModule<BrushModuleImpl> staticBrushModule;
// greebo: The accessor function for the brush module containing the static instance
BrushModuleImpl& GlobalBrush()
{
return *staticBrushModule.getModule().get();
return *std::static_pointer_cast<BrushModuleImpl>(
module::GlobalModuleRegistry().getModule(MODULE_BRUSHCREATOR)
);
}
4 changes: 3 additions & 1 deletion radiant/camera/GlobalCamera.cpp
Expand Up @@ -628,5 +628,7 @@ module::StaticModule<GlobalCameraManager> cameraModule;
// The accessor function to the GlobalCameraManager instance
ui::GlobalCameraManager& GlobalCamera()
{
return *ui::cameraModule.getModule();
return *std::static_pointer_cast<ui::GlobalCameraManager>(
module::GlobalModuleRegistry().getModule(MODULE_CAMERA)
);
}
6 changes: 4 additions & 2 deletions radiant/map/AutoSaver.cpp
Expand Up @@ -43,6 +43,7 @@ namespace
const char* RKEY_AUTOSAVE_MAX_SNAPSHOT_FOLDER_SIZE = "user/ui/map/maxSnapshotFolderSize";
const char* RKEY_AUTOSAVE_SNAPSHOT_FOLDER_SIZE_HISTORY = "user/ui/map/snapshotFolderSizeHistory";
const char* GKEY_MAP_EXTENSION = "/mapFormat/fileExtension";
const char* const MODULE_AUTOSAVER = "AutomaticMapSaver";

std::string constructSnapshotName(const fs::path& snapshotPath, const std::string& mapName, int num)
{
Expand Down Expand Up @@ -364,7 +365,7 @@ void AutoMapSaver::onMapEvent(IMap::MapEvent ev)

const std::string& AutoMapSaver::getName() const
{
static std::string _name("AutomaticMapSaver");
static std::string _name(MODULE_AUTOSAVER);
return _name;
}

Expand Down Expand Up @@ -434,7 +435,8 @@ module::StaticModule<AutoMapSaver> staticAutoSaverModule;

AutoMapSaver& AutoSaver()
{
return *staticAutoSaverModule.getModule();
return *std::static_pointer_cast<AutoMapSaver>(
module::GlobalModuleRegistry().getModule(MODULE_AUTOSAVER));
}

} // namespace map
6 changes: 4 additions & 2 deletions radiant/map/EditingStopwatch.cpp
Expand Up @@ -24,6 +24,7 @@ namespace
const int TIMER_INTERVAL_SECS = 1;
const char* const STATUS_BAR_ELEMENT = "EditTime";
const char* const MAP_PROPERTY_KEY = "EditTimeInSeconds";
const char* const MODULE_EDITING_STOPWATCH = "EditingStopwatch";
}

EditingStopwatch::EditingStopwatch() :
Expand All @@ -32,7 +33,7 @@ EditingStopwatch::EditingStopwatch() :

const std::string& EditingStopwatch::getName() const
{
static std::string _name("EditingStopwatch");
static std::string _name(MODULE_EDITING_STOPWATCH);
return _name;
}

Expand Down Expand Up @@ -207,7 +208,8 @@ module::StaticModule<EditingStopwatch> _stopwatchModule;

EditingStopwatch& EditingStopwatch::GetInstanceInternal()
{
return *_stopwatchModule.getModule();
return *std::static_pointer_cast<EditingStopwatch>(
module::GlobalModuleRegistry().getModule(MODULE_EDITING_STOPWATCH));
}

}
3 changes: 2 additions & 1 deletion radiant/map/MapModules.cpp
Expand Up @@ -23,5 +23,6 @@ module::StaticModule<map::Map> staticMapModule;
// Accessor method containing the singleton Map instance
map::Map& GlobalMap()
{
return *staticMapModule.getModule();
return *std::static_pointer_cast<map::Map>(
module::GlobalModuleRegistry().getModule(MODULE_MAP));
}
6 changes: 4 additions & 2 deletions radiant/map/RegionManager.cpp
Expand Up @@ -41,6 +41,7 @@ namespace map
{
typedef std::shared_ptr<RegionManager> RegionManagerPtr;
const std::string GKEY_PLAYER_START_ECLASS = "/mapFormat/playerStartPoint";
const char* const MODULE_REGION_MANAGER = "RegionManager";
}

RegionManager::RegionManager() :
Expand Down Expand Up @@ -393,7 +394,7 @@ void RegionManager::initialiseCommands()

const std::string& RegionManager::getName() const
{
static std::string _name("RegionManager");
static std::string _name(MODULE_REGION_MANAGER);
return _name;
}

Expand Down Expand Up @@ -465,5 +466,6 @@ module::StaticModule<RegionManager> staticRegionManagerModule;

map::RegionManager& GlobalRegion()
{
return *map::staticRegionManagerModule.getModule();
return *std::static_pointer_cast<map::RegionManager>(
module::GlobalModuleRegistry().getModule(map::MODULE_REGION_MANAGER));
}
10 changes: 0 additions & 10 deletions radiant/modulesystem/ModuleRegistry.cpp
Expand Up @@ -5,7 +5,6 @@
#include <stdexcept>
#include <iostream>
#include "ApplicationContextImpl.h"
#include "StaticModule.h"

#include <wx/app.h>
#include <fmt/format.h>
Expand Down Expand Up @@ -148,15 +147,6 @@ void ModuleRegistry::loadAndInitialiseModules()

_sigModuleInitialisationProgress.emit(_("Searching for Modules"), 0.0f);

// Pick up all the statically registered modules
internal::StaticModuleList::ForEachModule([this](const RegisterableModulePtr& module)
{
registerModule(module);
});

// Be sure the list is cleared after registration
internal::StaticModuleList::Clear();

rMessage() << "ModuleRegistry Compatibility Level is " << getCompatibilityLevel() << std::endl;

// Invoke the ModuleLoad routine to load the DLLs from modules/ and plugins/
Expand Down
14 changes: 6 additions & 8 deletions radiant/modulesystem/StaticModule.cpp
Expand Up @@ -15,21 +15,19 @@ StaticModuleList::~StaticModuleList()
assert(empty());
}

void StaticModuleList::Add(const RegisterableModulePtr& module)
void StaticModuleList::Add(const ModuleCreationFunc& creationFunc)
{
Instance().push_back(module);
Instance().push_back(creationFunc);
}

void StaticModuleList::ForEachModule(const std::function<void(const RegisterableModulePtr&)>& func)
void StaticModuleList::RegisterModules()
{
for (const auto& module : Instance())
for (const auto& creationFunc : Instance())
{
func(module);
module::GlobalModuleRegistry().registerModule(creationFunc());
}
}

void StaticModuleList::Clear()
{
// Be sure the list is cleared after registration
Instance().clear();
}

Expand Down
33 changes: 13 additions & 20 deletions radiant/modulesystem/StaticModule.h
@@ -1,5 +1,6 @@
#pragma once

#include <functional>
#include "imodule.h"
#include "ModuleRegistry.h"

Expand Down Expand Up @@ -31,17 +32,19 @@ namespace internal
* and acquired by the ModuleRegistry, after which point
* this list will be cleared.
*/
typedef std::function<RegisterableModulePtr()> ModuleCreationFunc;

class StaticModuleList :
private std::list<RegisterableModulePtr>
private std::list<ModuleCreationFunc>
{
public:
~StaticModuleList();

static void Add(const RegisterableModulePtr& module);
~StaticModuleList();

static void ForEachModule(const std::function<void(const RegisterableModulePtr&)>& func);
static void Add(const ModuleCreationFunc& creationFunc);

static void Clear();
// Creates all pre-registered modules and submits them to the registry
static void RegisterModules();

private:
static StaticModuleList& Instance();
Expand All @@ -54,24 +57,14 @@ class StaticModule
{
static_assert(std::is_base_of<RegisterableModule, ModuleType>::value, "ModuleType must be of type RegisterableModule");

private:
std::string _moduleName;

public:
StaticModule()
{
auto module = std::make_shared<ModuleType>();
_moduleName = module->getName();

// Add this to the list in the backend, it will be picked up later
internal::StaticModuleList::Add(module);
}

inline std::shared_ptr<ModuleType> getModule()
{
return std::static_pointer_cast<ModuleType>(
GlobalModuleRegistry().getModule(_moduleName)
);
// Add a creator to the list in the backend, it will be called by the registry later
internal::StaticModuleList::Add([]()->RegisterableModulePtr
{
return std::make_shared<ModuleType>();
});
}
};

Expand Down
3 changes: 2 additions & 1 deletion radiant/settings/GameManager.cpp
Expand Up @@ -431,7 +431,8 @@ module::StaticModule<Manager> gameManagerModule;

Manager& Manager::Instance()
{
return *gameManagerModule.getModule();
return *std::static_pointer_cast<Manager>(
module::GlobalModuleRegistry().getModule(MODULE_GAMEMANAGER));
}

} // namespace game
3 changes: 2 additions & 1 deletion radiant/settings/PreferenceSystem.cpp
Expand Up @@ -56,5 +56,6 @@ module::StaticModule<PreferenceSystem> preferenceSystemModule;

settings::PreferenceSystem& GetPreferenceSystem()
{
return *settings::preferenceSystemModule.getModule();
return *std::static_pointer_cast<settings::PreferenceSystem>(
module::GlobalModuleRegistry().getModule(MODULE_PREFERENCESYSTEM));
}
1 change: 0 additions & 1 deletion radiant/ui/about/AboutDialog.cpp
Expand Up @@ -96,7 +96,6 @@ void AboutDialog::populateWindow()
findNamedObject<wxStaticText>(this, "AboutDialogHeader1")->SetFont(bold);
findNamedObject<wxStaticText>(this, "AboutDialogHeader2")->SetFont(bold);
findNamedObject<wxStaticText>(this, "AboutDialogHeader3")->SetFont(bold);
findNamedObject<wxStaticText>(this, "AboutDialogHeader4")->SetFont(bold);
}

void AboutDialog::_onClose(wxCommandEvent& ev)
Expand Down
5 changes: 3 additions & 2 deletions radiant/ui/ortho/OrthoContextMenu.cpp
Expand Up @@ -82,7 +82,8 @@ module::StaticModule<OrthoContextMenu> orthoContextMenuModule;

OrthoContextMenu& OrthoContextMenu::Instance()
{
return *orthoContextMenuModule.getModule();
return *std::static_pointer_cast<OrthoContextMenu>(
module::GlobalModuleRegistry().getModule("OrthoContextMenu"));
}

// Constructor
Expand Down Expand Up @@ -619,7 +620,7 @@ void OrthoContextMenu::addSectionItems(int section, bool noSpacer)

const std::string& OrthoContextMenu::getName() const
{
static std::string _name("OrthoContextMenu");
static std::string _name(MODULE_ORTHOCONTEXTMENU);
return _name;
}

Expand Down
3 changes: 2 additions & 1 deletion radiant/ui/texturebrowser/TextureBrowserManager.cpp
Expand Up @@ -111,7 +111,8 @@ module::StaticModule<TextureBrowserManager> texBrowserManagerModule;

TextureBrowserManager& TextureBrowserManager::Instance()
{
return *texBrowserManagerModule.getModule();
return *std::static_pointer_cast<TextureBrowserManager>(
module::GlobalModuleRegistry().getModule(MODULE_TEXTURE_BROWSER_MANAGER));
}

} // namespace
3 changes: 2 additions & 1 deletion radiant/xyview/GlobalXYWnd.cpp
Expand Up @@ -707,5 +707,6 @@ module::StaticModule<XYWndManager> xyWndModule;
// Accessor function returning the reference
ui::XYWndManager& GlobalXYWnd()
{
return *ui::xyWndModule.getModule();
return *std::static_pointer_cast<ui::XYWndManager>(
module::GlobalModuleRegistry().getModule(MODULE_ORTHOVIEWMANAGER));
}
4 changes: 0 additions & 4 deletions tools/msvc/DarkRadiant.vcxproj
Expand Up @@ -868,8 +868,6 @@
<ClCompile Include="..\..\radiant\map\StartupMapLoader.cpp" />
<ClCompile Include="..\..\radiant\map\algorithm\Traverse.cpp" />
<ClCompile Include="..\..\radiant\modulesystem\ApplicationContextImpl.cpp" />
<ClCompile Include="..\..\radiant\modulesystem\ModuleLoader.cpp" />
<ClCompile Include="..\..\radiant\modulesystem\ModuleRegistry.cpp" />
<ClCompile Include="..\..\radiant\namespace\Namespace.cpp" />
<ClCompile Include="..\..\radiant\namespace\NamespaceFactory.cpp" />
<ClCompile Include="..\..\radiant\patch\Patch.cpp" />
Expand Down Expand Up @@ -1351,8 +1349,6 @@
<ClInclude Include="..\..\radiant\map\algorithm\Traverse.h" />
<ClInclude Include="..\..\radiant\map\algorithm\WorldspawnArgFinder.h" />
<ClInclude Include="..\..\radiant\modulesystem\ApplicationContextImpl.h" />
<ClInclude Include="..\..\radiant\modulesystem\ModuleLoader.h" />
<ClInclude Include="..\..\radiant\modulesystem\ModuleRegistry.h" />
<ClInclude Include="..\..\radiant\modulesystem\StaticModule.h" />
<ClInclude Include="..\..\radiant\namespace\ComplexName.h" />
<ClInclude Include="..\..\radiant\namespace\Namespace.h" />
Expand Down
12 changes: 0 additions & 12 deletions tools/msvc/DarkRadiant.vcxproj.filters
Expand Up @@ -442,12 +442,6 @@
<ClCompile Include="..\..\radiant\modulesystem\ApplicationContextImpl.cpp">
<Filter>src\modulesystem</Filter>
</ClCompile>
<ClCompile Include="..\..\radiant\modulesystem\ModuleLoader.cpp">
<Filter>src\modulesystem</Filter>
</ClCompile>
<ClCompile Include="..\..\radiant\modulesystem\ModuleRegistry.cpp">
<Filter>src\modulesystem</Filter>
</ClCompile>
<ClCompile Include="..\..\radiant\namespace\Namespace.cpp">
<Filter>src\namespace</Filter>
</ClCompile>
Expand Down Expand Up @@ -1758,12 +1752,6 @@
<ClInclude Include="..\..\radiant\modulesystem\ApplicationContextImpl.h">
<Filter>src\modulesystem</Filter>
</ClInclude>
<ClInclude Include="..\..\radiant\modulesystem\ModuleLoader.h">
<Filter>src\modulesystem</Filter>
</ClInclude>
<ClInclude Include="..\..\radiant\modulesystem\ModuleRegistry.h">
<Filter>src\modulesystem</Filter>
</ClInclude>
<ClInclude Include="..\..\radiant\modulesystem\StaticModule.h">
<Filter>src\modulesystem</Filter>
</ClInclude>
Expand Down

0 comments on commit 1d7e354

Please sign in to comment.