| 242 | } |
| 243 | |
| 244 | bool 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 | |
| 267 | micro_queue& micro_queue::assign( const micro_queue& src, concurrent_queue_base& base, |
| 268 | concurrent_queue_base::copy_specifics op_type ) |
no test coverage detected