2#ifndef YAZE_APP_PLATFORM_WASM_WORKER_POOL_H
3#define YAZE_APP_PLATFORM_WASM_WORKER_POOL_H
13#include <condition_variable>
18#include <unordered_map>
19#include <emscripten.h>
20#include <emscripten/threading.h>
63 using TaskCallback = std::function<void(
bool success,
const std::vector<uint8_t>& result)>;
66 using ProgressCallback = std::function<void(
float progress,
const std::string& message)>;
111 const std::vector<uint8_t>& input_data,
125 const std::vector<uint8_t>& input_data,
133 const std::vector<uint8_t>& input_data,
144 bool Cancel(uint32_t task_id);
157 bool WaitAll(uint32_t timeout_ms = 0);
195 void ProcessTask(
const Task& task,
size_t worker_id);
198 std::vector<uint8_t>
ExecuteTask(
const Task& task);
207 void ReportProgress(uint32_t task_id,
float progress,
const std::string& message);
214 static void MainThreadCallbackHandler(
void* arg);
226 std::vector<std::thread> workers_;
231 bool operator()(
const std::shared_ptr<Task>& a,
const std::shared_ptr<Task>& b) {
233 if (a->priority != b->priority) {
234 return static_cast<int>(a->priority) <
static_cast<int>(b->priority);
236 return a->id > b->id;
240 std::priority_queue<std::shared_ptr<Task>,
241 std::vector<std::shared_ptr<Task>>,
242 TaskCompare> task_queue_;
245 std::unordered_map<uint32_t, std::shared_ptr<Task>> active_tasks_;
248 mutable std::mutex queue_mutex_;
249 std::condition_variable queue_cv_;
250 std::condition_variable completion_cv_;
253 std::queue<std::function<void()>> callback_queue_;
254 mutable std::mutex callback_mutex_;