MCPcopy Create free account
hub / github.com/SakuraEngine/SakuraEngine / enqueue

Function enqueue

modules/core/task/src/task2.cpp:416–449  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

414
415
416 void enqueue(Task&& task, int workerIdx)
417 {
418 //SkrZoneScopedN("EnqueueTask");
419 scheduler_t* scheduler = scheduler_t::instance();
420 SKR_ASSERT(scheduler != nullptr);
421 size_t workerCount = scheduler->config.numThreads;
422 while(true)
423 {
424 int idx = 0;
425 if(workerIdx < 0)
426 {
427 auto i = --scheduler->nextSpinningWorkerIdx % scheduler->spinningWorkers.size();
428 idx = scheduler->spinningWorkers[i].exchange(-1);
429 if(idx < 0)
430 idx = scheduler->nextEnqueueIndex++ % (workerCount - 1) + 1;
431 }
432 else
433 {
434 SKR_ASSERT((uint32_t)workerIdx < workerCount);
435 idx = workerIdx;
436 }
437 auto& worker = *(Worker*)scheduler->workers[idx];
438 if(workerIdx < 0)
439 {
440 worker.enqueue(std::move(task), false);
441 return;
442 }
443 else if(skr_mutex_try_acquire(&worker.work.mutex))
444 {
445 worker.enqueuePinnedAndUnlock(std::move(task));
446 return;
447 }
448 }
449 }
450
451 void scheduler_t::schedule(skr::stl_function<void ()>&& function)
452 {

Callers 3

signalStopMethod · 0.85
scheduleMethod · 0.85
notifyMethod · 0.85

Calls 6

exchangeMethod · 0.80
moveFunction · 0.50
skr_mutex_try_acquireFunction · 0.50
sizeMethod · 0.45
enqueueMethod · 0.45

Tested by

no test coverage detected