refactor: extract post-runnables to a separate class
This commit is contained in:
parent
e98132f4da
commit
357e4f8607
29
src/PostRunnables.hpp
Normal file
29
src/PostRunnables.hpp
Normal file
@ -0,0 +1,29 @@
|
|||||||
|
#pragma once
|
||||||
|
|
||||||
|
#include <queue>
|
||||||
|
#include <mutex>
|
||||||
|
#include "delegates.hpp"
|
||||||
|
|
||||||
|
class PostRunnables {
|
||||||
|
std::queue<runnable> runnables;
|
||||||
|
std::recursive_mutex mutex;
|
||||||
|
public:
|
||||||
|
void postRunnable(runnable task) {
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(mutex);
|
||||||
|
runnables.push(std::move(task));
|
||||||
|
}
|
||||||
|
|
||||||
|
void run() {
|
||||||
|
std::queue<runnable> tasksToRun;
|
||||||
|
{
|
||||||
|
std::lock_guard<std::recursive_mutex> lock(mutex);
|
||||||
|
std::swap(tasksToRun, runnables);
|
||||||
|
}
|
||||||
|
|
||||||
|
while (!tasksToRun.empty()) {
|
||||||
|
auto& task = tasksToRun.front();
|
||||||
|
task();
|
||||||
|
tasksToRun.pop();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
@ -184,7 +184,7 @@ void Engine::run() {
|
|||||||
|
|
||||||
void Engine::postUpdate() {
|
void Engine::postUpdate() {
|
||||||
network->update();
|
network->update();
|
||||||
processPostRunnables();
|
postRunnables.run();
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::updateFrontend() {
|
void Engine::updateFrontend() {
|
||||||
@ -213,15 +213,6 @@ void Engine::renderFrame() {
|
|||||||
gui->draw(ctx, *assets);
|
gui->draw(ctx, *assets);
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::processPostRunnables() {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(postRunnablesMutex);
|
|
||||||
while (!postRunnables.empty()) {
|
|
||||||
postRunnables.front()();
|
|
||||||
postRunnables.pop();
|
|
||||||
}
|
|
||||||
scripting::process_post_runnables();
|
|
||||||
}
|
|
||||||
|
|
||||||
void Engine::saveSettings() {
|
void Engine::saveSettings() {
|
||||||
logger.info() << "saving settings";
|
logger.info() << "saving settings";
|
||||||
files::write_string(paths.getSettingsFile(), toml::stringify(settingsHandler));
|
files::write_string(paths.getSettingsFile(), toml::stringify(settingsHandler));
|
||||||
@ -517,11 +508,6 @@ std::shared_ptr<Screen> Engine::getScreen() {
|
|||||||
return screen;
|
return screen;
|
||||||
}
|
}
|
||||||
|
|
||||||
void Engine::postRunnable(const runnable& callback) {
|
|
||||||
std::lock_guard<std::recursive_mutex> lock(postRunnablesMutex);
|
|
||||||
postRunnables.push(callback);
|
|
||||||
}
|
|
||||||
|
|
||||||
SettingsHandler& Engine::getSettingsHandler() {
|
SettingsHandler& Engine::getSettingsHandler() {
|
||||||
return settingsHandler;
|
return settingsHandler;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -11,15 +11,14 @@
|
|||||||
#include "files/engine_paths.hpp"
|
#include "files/engine_paths.hpp"
|
||||||
#include "files/settings_io.hpp"
|
#include "files/settings_io.hpp"
|
||||||
#include "util/ObjectsKeeper.hpp"
|
#include "util/ObjectsKeeper.hpp"
|
||||||
|
#include "PostRunnables.hpp"
|
||||||
#include "Time.hpp"
|
#include "Time.hpp"
|
||||||
|
|
||||||
#include <filesystem>
|
#include <filesystem>
|
||||||
#include <memory>
|
#include <memory>
|
||||||
#include <queue>
|
|
||||||
#include <stdexcept>
|
#include <stdexcept>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
#include <mutex>
|
|
||||||
|
|
||||||
class Level;
|
class Level;
|
||||||
class Screen;
|
class Screen;
|
||||||
@ -65,13 +64,12 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
std::vector<ContentPack> contentPacks;
|
std::vector<ContentPack> contentPacks;
|
||||||
std::unique_ptr<Content> content;
|
std::unique_ptr<Content> content;
|
||||||
std::unique_ptr<ResPaths> resPaths;
|
std::unique_ptr<ResPaths> resPaths;
|
||||||
std::queue<runnable> postRunnables;
|
|
||||||
std::recursive_mutex postRunnablesMutex;
|
|
||||||
std::unique_ptr<EngineController> controller;
|
std::unique_ptr<EngineController> controller;
|
||||||
std::unique_ptr<cmd::CommandsInterpreter> interpreter;
|
std::unique_ptr<cmd::CommandsInterpreter> interpreter;
|
||||||
std::unique_ptr<network::Network> network;
|
std::unique_ptr<network::Network> network;
|
||||||
std::vector<std::string> basePacks;
|
std::vector<std::string> basePacks;
|
||||||
std::unique_ptr<gui::GUI> gui;
|
std::unique_ptr<gui::GUI> gui;
|
||||||
|
PostRunnables postRunnables;
|
||||||
Time time;
|
Time time;
|
||||||
consumer<std::unique_ptr<Level>> levelConsumer;
|
consumer<std::unique_ptr<Level>> levelConsumer;
|
||||||
bool quitSignal = false;
|
bool quitSignal = false;
|
||||||
@ -80,7 +78,6 @@ class Engine : public util::ObjectsKeeper {
|
|||||||
void loadSettings();
|
void loadSettings();
|
||||||
void saveSettings();
|
void saveSettings();
|
||||||
void updateHotkeys();
|
void updateHotkeys();
|
||||||
void processPostRunnables();
|
|
||||||
void loadAssets();
|
void loadAssets();
|
||||||
public:
|
public:
|
||||||
Engine(CoreParameters coreParameters);
|
Engine(CoreParameters coreParameters);
|
||||||
@ -157,7 +154,9 @@ public:
|
|||||||
std::shared_ptr<Screen> getScreen();
|
std::shared_ptr<Screen> getScreen();
|
||||||
|
|
||||||
/// @brief Enqueue function call to the end of current frame in draw thread
|
/// @brief Enqueue function call to the end of current frame in draw thread
|
||||||
void postRunnable(const runnable& callback);
|
void postRunnable(const runnable& callback) {
|
||||||
|
postRunnables.postRunnable(callback);
|
||||||
|
}
|
||||||
|
|
||||||
void saveScreenshot();
|
void saveScreenshot();
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user