MCPcopy Create free account
hub / github.com/IppClub/Dora-SSR / popTask

Method popTask

Source/Common/Async.cpp:290–321  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

288}
289
290bool AsyncThread::popTask(size_t workerIndex, Async*& source, Own<QEvent>& event) {
291 Async* self = _process[workerIndex].get();
292 if (!self) {
293 return false;
294 }
295 event = self->pollWorkerEvent();
296 if (event) {
297 source = self;
298 return true;
299 }
300 size_t count = processCount();
301 if (count <= 1) {
302 return false;
303 }
304 size_t start = _nextStealFrom.fetch_add(1, std::memory_order_relaxed) % count;
305 for (size_t i = 0; i < count; i++) {
306 size_t target = (start + i) % count;
307 if (target == workerIndex) {
308 continue;
309 }
310 Async* victim = _process[target].get();
311 if (!victim) {
312 continue;
313 }
314 event = victim->pollWorkerEvent();
315 if (event) {
316 source = victim;
317 return true;
318 }
319 }
320 return false;
321}
322
323void AsyncThread::notifyTaskPosted() {
324 _workSemaphore.post();

Callers 1

workMethod · 0.80

Calls 2

pollWorkerEventMethod · 0.80
getMethod · 0.65

Tested by

no test coverage detected