Skip to content

Commit

Permalink
#5231: Remove wxWidgets dependency from ModuleRegistry.
Browse files Browse the repository at this point in the history
  • Loading branch information
codereader committed Aug 1, 2020
1 parent d34d938 commit df17e53
Show file tree
Hide file tree
Showing 5 changed files with 48 additions and 19 deletions.
12 changes: 9 additions & 3 deletions include/imodule.h
Expand Up @@ -290,7 +290,7 @@ class IModuleRegistry
/**
* Invoked when all modules have been initialised.
*/
virtual sigc::signal<void> signal_allModulesInitialised() const = 0;
virtual sigc::signal<void>& signal_allModulesInitialised() = 0;

/**
* Progress function called during module loading and intialisation.
Expand All @@ -299,12 +299,18 @@ class IModuleRegistry
* will be in the range [0.0f..1.0f].
*/
typedef sigc::signal<void, const std::string&, float> ProgressSignal;
virtual ProgressSignal signal_moduleInitialisationProgress() const = 0;
virtual ProgressSignal& signal_moduleInitialisationProgress() = 0;

/**
* Invoked when all modules have been shut down (i.e. after shutdownModule()).
*/
virtual sigc::signal<void> signal_allModulesUninitialised() const = 0;
virtual sigc::signal<void>& signal_allModulesUninitialised() = 0;

/**
* Invoked right before the module binaries will be unloaded, which will
* trigger the destruction of any static instances in them.
*/
virtual sigc::signal<void>& signal_modulesUnloading() = 0;

// The compatibility level this Registry instance was compiled against.
// Old module registrations will be rejected by the registry anyway,
Expand Down
17 changes: 17 additions & 0 deletions radiant/RadiantApp.cpp
Expand Up @@ -152,8 +152,25 @@ void RadiantApp::onStartupEvent(wxCommandEvent& ev)
// Pick up all the statically defined modules and register them
module::internal::StaticModuleList::RegisterModules();

// Register to the modules unloading event, we need to get notified
// before the DLLs/SOs are relased to give wxWidgets a chance to clean up
_modulesUnloadingHandler = _coreModule->get()->getModuleRegistry().signal_modulesUnloading()
.connect(sigc::mem_fun(this, &RadiantApp::onModulesUnloading));

// Startup the application
_coreModule->get()->startup();

// Scope ends here, PIDFile is deleted by its destructor
}

void RadiantApp::onModulesUnloading()
{
// We need to delete all pending objects before unloading modules
// wxWidgets needs a chance to delete them before memory access is denied
if (wxTheApp != nullptr)
{
wxTheApp->ProcessIdle();
}

_modulesUnloadingHandler.disconnect();
}
6 changes: 5 additions & 1 deletion radiant/RadiantApp.h
@@ -1,6 +1,7 @@
#pragma once

#include <wx/app.h>
#include <sigc++/connection.h>
#include "modulesystem/ApplicationContextImpl.h"
#include "module/CoreModule.h"

Expand All @@ -19,11 +20,13 @@ class RadiantApp :
public wxApp
{
// The RadiantApp owns the ApplicationContext which is then passed to the
// ModuleRegistry as a refernce.
// ModuleRegistry as a reference.
radiant::ApplicationContextImpl _context;

std::unique_ptr<module::CoreModule> _coreModule;

sigc::connection _modulesUnloadingHandler;

public:
bool OnInit() override;
int OnExit() override;
Expand All @@ -35,4 +38,5 @@ class RadiantApp :

private:
void onStartupEvent(wxCommandEvent& ev);
void onModulesUnloading();
};
24 changes: 12 additions & 12 deletions radiantcore/modulesystem/ModuleRegistry.cpp
Expand Up @@ -7,7 +7,6 @@
#include <iostream>
#include "ModuleLoader.h"

#include <wx/app.h>
#include <fmt/format.h>

namespace module
Expand Down Expand Up @@ -47,12 +46,8 @@ void ModuleRegistry::unloadModules()

tempMap.clear();

// We need to delete all pending objects before unloading modules
// wxWidgets needs a chance to delete them before memory access is denied
if (wxTheApp != NULL)
{
wxTheApp->ProcessIdle();
}
// Send out the signal that the DLLs/SOs will be unloaded
signal_modulesUnloading().emit();

_loader->unloadModules();
}
Expand Down Expand Up @@ -131,7 +126,7 @@ void ModuleRegistry::initialiseModuleRecursive(const std::string& name)
_progress);

// Initialise the module itself, now that the dependencies are ready
wxASSERT(_context);
assert(_context);
module->initialiseModule(*_context);
}

Expand Down Expand Up @@ -244,7 +239,7 @@ RegisterableModulePtr ModuleRegistry::getModule(const std::string& name) const {

const ApplicationContext& ModuleRegistry::getApplicationContext() const
{
wxASSERT(_context);
assert(_context);
return *_context;
}

Expand All @@ -263,21 +258,26 @@ applog::ILogWriter& ModuleRegistry::getApplicationLogWriter()
return coreModule->getLogWriter();
}

sigc::signal<void> ModuleRegistry::signal_allModulesInitialised() const
sigc::signal<void>& ModuleRegistry::signal_allModulesInitialised()
{
return _sigAllModulesInitialised;
}

ModuleRegistry::ProgressSignal ModuleRegistry::signal_moduleInitialisationProgress() const
ModuleRegistry::ProgressSignal& ModuleRegistry::signal_moduleInitialisationProgress()
{
return _sigModuleInitialisationProgress;
}

sigc::signal<void> ModuleRegistry::signal_allModulesUninitialised() const
sigc::signal<void>& ModuleRegistry::signal_allModulesUninitialised()
{
return _sigAllModulesUninitialised;
}

sigc::signal<void>& ModuleRegistry::signal_modulesUnloading()
{
return _sigModulesUnloading;
}

std::size_t ModuleRegistry::getCompatibilityLevel() const
{
return MODULE_COMPATIBILITY_LEVEL;
Expand Down
8 changes: 5 additions & 3 deletions radiantcore/modulesystem/ModuleRegistry.h
Expand Up @@ -43,6 +43,7 @@ class ModuleRegistry :
// Signals fired after ALL modules have been initialised or shut down.
sigc::signal<void> _sigAllModulesInitialised;
sigc::signal<void> _sigAllModulesUninitialised;
sigc::signal<void> _sigModulesUnloading;
ProgressSignal _sigModuleInitialisationProgress;

// Dynamic library loader
Expand Down Expand Up @@ -73,9 +74,10 @@ class ModuleRegistry :

applog::ILogWriter& getApplicationLogWriter() override;

sigc::signal<void> signal_allModulesInitialised() const override;
ProgressSignal signal_moduleInitialisationProgress() const override;
sigc::signal<void> signal_allModulesUninitialised() const override;
sigc::signal<void>& signal_allModulesInitialised() override;
ProgressSignal& signal_moduleInitialisationProgress() override;
sigc::signal<void>& signal_allModulesUninitialised() override;
sigc::signal<void>& signal_modulesUnloading() override;

std::size_t getCompatibilityLevel() const override;

Expand Down

0 comments on commit df17e53

Please sign in to comment.