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

Method pop

benchmarks/tbb/concurrent_queue.cpp:244–265  ·  view source on GitHub ↗

Source from the content-addressed store, hash-verified

242}
243
244bool micro_queue::pop( void* dst, ticket k, concurrent_queue_base& base ) {
245 k &= -concurrent_queue_rep::n_queue;
246 spin_wait_until_eq( head_counter, k );
247 spin_wait_while_eq( tail_counter, k );
248 page& p = *head_page;
249 __TBB_ASSERT( &p, NULL );
250 size_t index = modulo_power_of_two( k/concurrent_queue_rep::n_queue, base.items_per_page );
251 bool success = false;
252 {
253 micro_queue_pop_finalizer finalizer( *this, base, k+concurrent_queue_rep::n_queue, index==base.items_per_page-1 ? &p : NULL );
254 if( p.mask & uintptr_t(1)<<index ) {
255 success = true;
256 ITT_NOTIFY( sync_acquired, dst );
257 ITT_NOTIFY( sync_acquired, head_page );
258 base.assign_and_destroy_item( dst, p, index );
259 ITT_NOTIFY( sync_releasing, head_page );
260 } else {
261 --base.my_rep->n_invalid_entries;
262 }
263 }
264 return success;
265}
266
267micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base& base,
268 concurrent_queue_base::copy_specifics op_type )

Callers 6

try_dequeueMethod · 0.45
try_dequeueMethod · 0.45
custom_scheduler.hFile · 0.45
get_mailbox_taskMethod · 0.45
internal_popMethod · 0.45

Calls 4

spin_wait_until_eqFunction · 0.85
spin_wait_while_eqFunction · 0.85
modulo_power_of_twoFunction · 0.85

Tested by

no test coverage detected