#include "globalpool.h"
#include <cassert>
#include <emscripten/threading.h>
#include <emscripten/val.h>
#include <emscripten/wasm_worker.h>

GlobalThreadPool::GlobalThreadPool() {
  return;
  assert(emscripten_wasm_worker_self_id() == 0);
  if (emscripten::val::global("window").isUndefined()) {
    // running in node for tsgen or tests
    return;
  }
  workq = std::make_unique<DeadlineWorkQ>();
  pool = std::make_unique<DeadlineThreadPool>(
      std::max(4, emscripten_num_logical_cores()), *workq);
}

DeadlineWorkQ::Future GlobalThreadPool::submit(std::function<void()> &&f,
                                               size_t deadline) {
  assert(instance.workq != nullptr);
  return instance.workq->submit(std::move(f), deadline);
}

DeadlineWorkQ &GlobalThreadPool::getWorkQ() {
  assert(instance.workq != nullptr);
  return *instance.workq;
}

GlobalThreadPool GlobalThreadPool::instance{};