Commit 0a2c5e3c authored by tqcq's avatar tqcq
Browse files

fix crash for static ThreadPool

parent 85852ee2
Loading
Loading
Loading
Loading
+15 −8
Original line number Diff line number Diff line
@@ -14,23 +14,30 @@ DecrementFuturesUsage()

}// namespace future_detail

static ThreadPool g_default_thread_pool;
TaskQueueBase *g_default_scheduler = &g_default_thread_pool;
static std::atomic<TaskQueueBase *> g_default_scheduler{nullptr};
// static ThreadPool default_thread_pool;
static std::unique_ptr<Thread> g_default_thread;

void
SetDefaultScheduler(TaskQueueBase *scheduler) noexcept
{
    if (scheduler == nullptr) {
        g_default_scheduler = &g_default_thread_pool;
    } else {
        g_default_scheduler = scheduler;
    }
    SLED_ASSERT(scheduler, "scheduler is nullptr");
    g_default_scheduler.store(scheduler, std::memory_order_release);
}

TaskQueueBase *
GetDefaultScheduler() noexcept
{
    return g_default_scheduler;
    static std::once_flag flag;
    std::call_once(flag, [&] {
        g_default_thread = sled::Thread::Create();
        g_default_thread->Start();
        TaskQueueBase *null_scheduler = nullptr;
        while (g_default_scheduler.load() == nullptr) {
            g_default_scheduler.compare_exchange_weak(null_scheduler, g_default_thread.get());
        }
    });
    return g_default_scheduler.load(std::memory_order_acquire);
}

}// namespace sled