diff --git a/CMakeLists.txt b/CMakeLists.txt index 948db86..eea286f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -39,7 +39,7 @@ add_executable(autocat_gnome main.cpp services/Settings.h gui/TitleBar.cpp gui/TitleBar.h - coro/Coro.h) + coro/Coro.h coro/GLibMainContextExecutor.cpp coro/GLibMainContextExecutor.h) target_link_libraries(autocat_gnome ${GTKMM_LIBRARIES} ${GLIBMM_LIBRARIES} diff --git a/coro/GLibMainContextExecutor.cpp b/coro/GLibMainContextExecutor.cpp new file mode 100644 index 0000000..226af3a --- /dev/null +++ b/coro/GLibMainContextExecutor.cpp @@ -0,0 +1,32 @@ +// +// Created by selim on 09.05.2022. +// + +#include "GLibMainContextExecutor.h" +#include + +int callback(void* data) { + auto executor = reinterpret_cast(data); + executor->runFront(); + return G_SOURCE_REMOVE; +} + +void GLibMainContextExecutor::add(folly::Func func) { + std::lock_guard lock(_mutex); + _tasks.push(std::move(func)); + g_idle_add_full(G_PRIORITY_DEFAULT_IDLE, callback, this, nullptr); +} + +void GLibMainContextExecutor::runFront() { + std::lock_guard lock(_mutex); + if(!_tasks.empty()) { + auto task = std::move(_tasks.front()); + _tasks.pop(); + task(); + } +} + +folly::Executor::KeepAlive GLibMainContextExecutor::instance() { + static GLibMainContextExecutor instance; + return folly::getKeepAliveToken(instance); +} diff --git a/coro/GLibMainContextExecutor.h b/coro/GLibMainContextExecutor.h new file mode 100644 index 0000000..1530b0f --- /dev/null +++ b/coro/GLibMainContextExecutor.h @@ -0,0 +1,25 @@ +// +// Created by selim on 09.05.2022. +// + +#ifndef AUTOCAT_GNOME_GLIBMAINCONTEXTEXECUTOR_H +#define AUTOCAT_GNOME_GLIBMAINCONTEXTEXECUTOR_H + +#include +#include +#include + +class GLibMainContextExecutor: public folly::Executor { +private: + std::queue _tasks; + std::mutex _mutex; + +public: + static folly::Executor::KeepAlive instance(); + ~GLibMainContextExecutor() override = default; + void add(folly::Func func) override; + void runFront(); +}; + + +#endif //AUTOCAT_GNOME_GLIBMAINCONTEXTEXECUTOR_H diff --git a/gui/LoginWindow.cpp b/gui/LoginWindow.cpp index a09b088..d82d756 100644 --- a/gui/LoginWindow.cpp +++ b/gui/LoginWindow.cpp @@ -5,6 +5,7 @@ #include "LoginWindow.h" #include "MainWindow.h" #include "../services/Api.h" +#include "../coro/GLibMainContextExecutor.h" #include #include @@ -50,7 +51,7 @@ void LoginWindow::loginClicked() { _spinner.start(); try { - User user = co_await Api::login(email, password).scheduleOn(folly::getGlobalIOExecutor()); + User user = co_await Api::login(email, password).scheduleOn(GLibMainContextExecutor::instance()); auto app = this->get_application(); auto mainWindow = new MainWindow(); mainWindow->show();