Skip to content

Commit

Permalink
#5107: Prevent the renderer getting into the way of DEF parsing (or v…
Browse files Browse the repository at this point in the history
…ice versa). Block screen updates until the DEFs are fully loaded.

Now with this change, the deadlock problem as reported in the issue 5107 is occurring in a resonably large map. This has to be fixed seperately.
  • Loading branch information
codereader committed Jun 25, 2021
1 parent 66d439b commit 8a5542c
Show file tree
Hide file tree
Showing 5 changed files with 31 additions and 3 deletions.
3 changes: 3 additions & 0 deletions include/ieclass.h
Expand Up @@ -330,6 +330,9 @@ class IEntityClassManager :
public RegisterableModule
{
public:
/// Signal emitted when starting to parse DEFs
virtual sigc::signal<void> defsLoadingSignal() const = 0;

/// Signal emitted when all DEFs have been loaded (after module initialisation)
virtual sigc::signal<void> defsLoadedSignal() const = 0;

Expand Down
21 changes: 18 additions & 3 deletions radiant/ui/mainframe/MainFrame.cpp
Expand Up @@ -6,6 +6,7 @@
#include "ieventmanager.h"
#include "ipreferencesystem.h"
#include "ientityinspector.h"
#include "ieclass.h"
#include "iorthoview.h"
#include "iregistry.h"
#include "iradiant.h"
Expand Down Expand Up @@ -48,7 +49,8 @@ namespace ui

MainFrame::MainFrame() :
_topLevelWindow(NULL),
_screenUpdatesEnabled(false) // not enabled until constructed
_screenUpdatesEnabled(false), // not enabled until constructed
_defLoadingBlocksUpdates(false)
{}

// RegisterableModule implementation
Expand All @@ -70,6 +72,7 @@ const StringSet& MainFrame::getDependencies() const
_dependencies.insert(MODULE_EVENTMANAGER);
_dependencies.insert(MODULE_COMMANDSYSTEM);
_dependencies.insert(MODULE_ORTHOVIEWMANAGER);
_dependencies.insert(MODULE_ECLASSMANAGER);
_dependencies.insert(MODULE_MAP);
}

Expand Down Expand Up @@ -145,6 +148,17 @@ void MainFrame::initialiseModule(const IApplicationContext& ctx)
sigc::mem_fun(this, &MainFrame::updateTitle)
);

// When the eclass defs are in progress of being loaded, block all updates
GlobalEntityClassManager().defsLoadingSignal().connect(
[this]() { _defLoadingBlocksUpdates = true; }
);

GlobalEntityClassManager().defsLoadedSignal().connect([this]()
{
_defLoadingBlocksUpdates = false;
}
);

// Subscribe for the post-module init event
module::GlobalModuleRegistry().signal_allModulesInitialised().connect(
sigc::mem_fun(this, &MainFrame::postModuleInitialisation));
Expand Down Expand Up @@ -483,8 +497,9 @@ void MainFrame::saveWindowPosition()
}
}

bool MainFrame::screenUpdatesEnabled() {
return _screenUpdatesEnabled;
bool MainFrame::screenUpdatesEnabled()
{
return _screenUpdatesEnabled && !_defLoadingBlocksUpdates;
}

void MainFrame::enableScreenUpdates() {
Expand Down
1 change: 1 addition & 0 deletions radiant/ui/mainframe/MainFrame.h
Expand Up @@ -19,6 +19,7 @@ class MainFrame :
TopLevelFrame* _topLevelWindow;

bool _screenUpdatesEnabled;
bool _defLoadingBlocksUpdates;

wxutil::WindowPosition _windowPosition;

Expand Down
7 changes: 7 additions & 0 deletions radiantcore/eclass/EClassManager.cpp
Expand Up @@ -28,6 +28,11 @@ EClassManager::EClassManager() :
_curParseStamp(0)
{}

sigc::signal<void> EClassManager::defsLoadingSignal() const
{
return _defsLoadingSignal;
}

sigc::signal<void> EClassManager::defsLoadedSignal() const
{
return _defsLoadedSignal;
Expand Down Expand Up @@ -181,6 +186,8 @@ void EClassManager::ensureDefsLoaded()

void EClassManager::loadDefAndResolveInheritance()
{
_defsLoadingSignal.emit();

parseDefFiles();
resolveInheritance();
applyColours();
Expand Down
2 changes: 2 additions & 0 deletions radiantcore/eclass/EClassManager.h
Expand Up @@ -49,6 +49,7 @@ class EClassManager :
// definitions have been parsed
std::size_t _curParseStamp;

sigc::signal<void> _defsLoadingSignal;
sigc::signal<void> _defsLoadedSignal;
sigc::signal<void> _defsReloadedSignal;

Expand All @@ -59,6 +60,7 @@ class EClassManager :
EClassManager();

// IEntityClassManager implementation
sigc::signal<void> defsLoadingSignal() const override;
sigc::signal<void> defsLoadedSignal() const override;
sigc::signal<void> defsReloadedSignal() const override;
virtual IEntityClassPtr findOrInsert(const std::string& name,
Expand Down

0 comments on commit 8a5542c

Please sign in to comment.