2020-02-23 19:07:18 +01:00
|
|
|
#pragma once
|
2020-02-20 02:05:54 +01:00
|
|
|
|
|
|
|
#include <vector>
|
2020-02-19 20:19:46 +01:00
|
|
|
#include <future>
|
2020-02-20 02:05:54 +01:00
|
|
|
#include <thread>
|
2020-02-23 19:07:18 +01:00
|
|
|
#include <queue>
|
2020-02-19 20:19:46 +01:00
|
|
|
#include <gui/GuiElement.h>
|
2020-02-20 02:05:54 +01:00
|
|
|
#include <coreinit/cache.h>
|
|
|
|
#include "utils/logger.h"
|
2020-02-19 20:19:46 +01:00
|
|
|
|
|
|
|
class AsyncExecutor {
|
|
|
|
public:
|
2022-01-09 13:37:16 +01:00
|
|
|
static void pushForDelete(GuiElement *element) {
|
|
|
|
if (!instance) {
|
2020-02-23 19:07:18 +01:00
|
|
|
instance = new AsyncExecutor();
|
|
|
|
}
|
|
|
|
instance->pushForDeleteInternal(element);
|
|
|
|
}
|
2022-01-09 13:37:16 +01:00
|
|
|
|
2020-02-23 19:07:18 +01:00
|
|
|
static void execute(std::function<void()> func) {
|
2022-01-09 13:37:16 +01:00
|
|
|
if (!instance) {
|
2020-02-23 19:07:18 +01:00
|
|
|
instance = new AsyncExecutor();
|
|
|
|
}
|
|
|
|
instance->executeInternal(func);
|
|
|
|
}
|
2020-02-19 20:19:46 +01:00
|
|
|
|
|
|
|
static void destroyInstance() {
|
2022-01-09 13:37:16 +01:00
|
|
|
if (instance) {
|
2020-02-19 20:19:46 +01:00
|
|
|
delete instance;
|
2022-01-09 13:37:16 +01:00
|
|
|
instance = nullptr;
|
2020-02-19 20:19:46 +01:00
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
private:
|
|
|
|
static AsyncExecutor *instance;
|
|
|
|
|
2020-02-20 02:05:54 +01:00
|
|
|
AsyncExecutor();
|
2022-01-09 13:37:16 +01:00
|
|
|
|
2020-02-23 19:07:18 +01:00
|
|
|
~AsyncExecutor();
|
2020-02-20 02:05:54 +01:00
|
|
|
|
2022-01-09 13:37:16 +01:00
|
|
|
void pushForDeleteInternal(GuiElement *element);
|
|
|
|
|
2020-02-23 19:07:18 +01:00
|
|
|
void executeInternal(std::function<void()> func);
|
2020-02-20 02:05:54 +01:00
|
|
|
|
2020-02-21 14:22:36 +01:00
|
|
|
std::recursive_mutex mutex;
|
2022-01-09 13:37:16 +01:00
|
|
|
std::thread *thread;
|
2020-02-20 02:05:54 +01:00
|
|
|
volatile bool exitThread = false;
|
2020-02-19 20:19:46 +01:00
|
|
|
|
2020-02-20 02:05:54 +01:00
|
|
|
std::vector<std::future<void>> elements;
|
2020-02-23 19:07:18 +01:00
|
|
|
|
|
|
|
std::recursive_mutex deleteListMutex;
|
2022-01-09 13:37:16 +01:00
|
|
|
std::queue<GuiElement *> deleteList;
|
2020-02-19 20:19:46 +01:00
|
|
|
};
|