MCPcopy Create free account
hub / github.com/cameron314/concurrentqueue / wake_some

Method wake_some

benchmarks/tbb/private_server.cpp:369–399  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

367}
368
369void private_server::wake_some( int additional_slack ) {
370 __TBB_ASSERT( additional_slack>=0, NULL );
371 private_worker* wakee[2];
372 private_worker**w = wakee;
373 {
374 asleep_list_mutex_type::scoped_lock lock(my_asleep_list_mutex);
375 while( my_asleep_list_root && w<wakee+2 ) {
376 if( additional_slack>0 ) {
377 if (additional_slack+my_slack<=0) // additional demand does not exceed surplus supply
378 break;
379 --additional_slack;
380 } else {
381 // Chain reaction; Try to claim unit of slack
382 int old;
383 do {
384 old = my_slack;
385 if( old<=0 ) goto done;
386 } while( my_slack.compare_and_swap(old-1,old)!=old );
387 }
388 // Pop sleeping worker to combine with claimed unit of slack
389 my_asleep_list_root = (*w++ = my_asleep_list_root)->my_next;
390 }
391 if( additional_slack ) {
392 // Contribute our unused slack to my_slack.
393 my_slack += additional_slack;
394 }
395 }
396done:
397 while( w>wakee )
398 (*--w)->wake_or_launch();
399}
400
401void private_server::adjust_job_count_estimate( int delta ) {
402#if TBB_USE_ASSERT

Callers

nothing calls this directly

Calls 2

wake_or_launchMethod · 0.80
compare_and_swapMethod · 0.45

Tested by

no test coverage detected