Extra2D/include/assets/async/asset_async_loader.h

46 lines
889 B
C
Raw Normal View History

#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