| 367 | } |
| 368 | |
| 369 | void 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 | } |
| 396 | done: |
| 397 | while( w>wakee ) |
| 398 | (*--w)->wake_or_launch(); |
| 399 | } |
| 400 | |
| 401 | void private_server::adjust_job_count_estimate( int delta ) { |
| 402 | #if TBB_USE_ASSERT |
nothing calls this directly
no test coverage detected