2 #include "lfds710_queue_bounded_manyproducer_manyconsumer_internal.h"
8 /****************************************************************************/
9 int lfds710_queue_bmm_dequeue( struct lfds710_queue_bmm_state *qbmms,
16 enum lfds710_misc_flag
17 finished_flag = LFDS710_MISC_FLAG_LOWERED;
30 backoff_iteration = LFDS710_BACKOFF_INITIAL_VALUE;
32 struct lfds710_queue_bmm_element
35 LFDS710_PAL_ASSERT( qbmms != NULL );
36 // TRD : key can be NULL
37 // TRD : value can be NULL
39 LFDS710_MISC_BARRIER_LOAD;
41 read_index = qbmms->read_index;
43 while( finished_flag == LFDS710_MISC_FLAG_LOWERED )
45 qbmme = &qbmms->element_array[ read_index & qbmms->mask ];
46 LFDS710_MISC_BARRIER_LOAD;
47 sequence_number = qbmme->sequence_number;
48 difference = (lfds710_pal_int_t) sequence_number - (lfds710_pal_int_t) (read_index + 1);
52 LFDS710_PAL_ATOMIC_CAS( &qbmms->read_index, &read_index, read_index + 1, LFDS710_MISC_CAS_STRENGTH_WEAK, result );
54 LFDS710_BACKOFF_EXPONENTIAL_BACKOFF( qbmms->dequeue_backoff, backoff_iteration );
56 finished_flag = LFDS710_MISC_FLAG_RAISED;
62 finished_flag = LFDS710_MISC_FLAG_RAISED;
67 LFDS710_MISC_BARRIER_LOAD;
68 read_index = qbmms->read_index;
77 *value = qbmme->value;
78 LFDS710_MISC_BARRIER_STORE;
79 qbmme->sequence_number = read_index + qbmms->mask + 1;
82 LFDS710_BACKOFF_AUTOTUNE( qbmms->dequeue_backoff, backoff_iteration );