2 #include "lfds710_queue_bounded_manyproducer_manyconsumer_internal.h"
8 /****************************************************************************/
9 int lfds710_queue_bmm_enqueue( 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 write_index = qbmms->write_index;
43 while( finished_flag == LFDS710_MISC_FLAG_LOWERED )
45 qbmme = &qbmms->element_array[ write_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) write_index;
52 LFDS710_PAL_ATOMIC_CAS( &qbmms->write_index, &write_index, write_index + 1, LFDS710_MISC_CAS_STRENGTH_WEAK, result );
54 LFDS710_BACKOFF_EXPONENTIAL_BACKOFF( qbmms->enqueue_backoff, backoff_iteration );
56 finished_flag = LFDS710_MISC_FLAG_RAISED;
62 finished_flag = LFDS710_MISC_FLAG_RAISED;
67 LFDS710_MISC_BARRIER_LOAD;
68 write_index = qbmms->write_index;
76 LFDS710_MISC_BARRIER_STORE;
77 qbmme->sequence_number = write_index + 1;
80 LFDS710_BACKOFF_AUTOTUNE( qbmms->enqueue_backoff, backoff_iteration );