| 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 | { |
no test coverage detected