46 lines
889 B
C
46 lines
889 B
C
|
|
#pragma once
|
||
|
|
|
||
|
|
#include <atomic>
|
||
|
|
#include <condition_variable>
|
||
|
|
#include <cstdint>
|
||
|
|
#include <functional>
|
||
|
|
#include <mutex>
|
||
|
|
#include <thread>
|
||
|
|
#include <vector>
|
||
|
|
|
||
|
|
namespace extra2d {
|
||
|
|
|
||
|
|
class AssetAsyncLoader {
|
||
|
|
public:
|
||
|
|
enum class Priority { Low = 0, Normal = 1, High = 2 };
|
||
|
|
|
||
|
|
struct Task {
|
||
|
|
Priority priority = Priority::Normal;
|
||
|
|
std::function<void()> work;
|
||
|
|
std::function<void()> onComplete;
|
||
|
|
};
|
||
|
|
|
||
|
|
~AssetAsyncLoader();
|
||
|
|
|
||
|
|
void init(uint32_t threadCount = 0);
|
||
|
|
void shutdown();
|
||
|
|
bool isRunning() const;
|
||
|
|
void submit(const Task &task);
|
||
|
|
void processCallbacks();
|
||
|
|
|
||
|
|
private:
|
||
|
|
void workerThreadLoop();
|
||
|
|
|
||
|
|
std::vector<Task> queue_;
|
||
|
|
std::vector<std::thread> workers_;
|
||
|
|
std::mutex queueMutex_;
|
||
|
|
std::condition_variable queueCV_;
|
||
|
|
std::atomic<bool> running_{false};
|
||
|
|
|
||
|
|
std::vector<std::function<void()>> completedCallbacks_;
|
||
|
|
std::mutex callbackMutex_;
|
||
|
|
};
|
||
|
|
|
||
|
|
} // namespace extra2d
|
||
|
|
|