2 #include "lfds710_queue_unbounded_manyproducer_manyconsumer_internal.h"
8 /****************************************************************************/
9 void lfds710_queue_umm_init_valid_on_current_logical_core( struct lfds710_queue_umm_state *qumms,
10 struct lfds710_queue_umm_element *qumme_dummy,
13 LFDS710_PAL_ASSERT( qumms != NULL );
14 LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &qumms->enqueue % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
15 LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &qumms->dequeue % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
16 LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &qumms->user_state % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
17 LFDS710_PAL_ASSERT( qumme_dummy != NULL );
18 LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) qumme_dummy->next % LFDS710_PAL_ALIGN_DOUBLE_POINTER == 0 );
19 // TRD : user_state can be NULL
21 /* TRD : qumme_dummy is a dummy element, needed for init
22 the qumms->enqueue and qumms->dequeue counters do not need to be initialized
23 but it does no harm to do so, and stops a valgrind complaint
26 LFDS710_PRNG_GENERATE( lfds710_misc_globals.ps, qumms->aba_counter );
28 qumms->enqueue[POINTER] = qumme_dummy;
29 qumms->enqueue[COUNTER] = (struct lfds710_queue_umm_element *) 0;
30 qumms->dequeue[POINTER] = qumme_dummy;
31 qumms->dequeue[COUNTER] = (struct lfds710_queue_umm_element *) 0;
33 qumme_dummy->next[POINTER] = NULL;
34 // TRD : no need here for an atomic add as we have a store barrier and force store below
35 qumme_dummy->next[COUNTER] = (struct lfds710_queue_umm_element *) qumms->aba_counter++;
36 qumme_dummy->key = NULL;
37 qumme_dummy->value = NULL;
39 qumms->user_state = user_state;
41 lfds710_misc_internal_backoff_init( &qumms->dequeue_backoff );
42 lfds710_misc_internal_backoff_init( &qumms->enqueue_backoff );
44 LFDS710_MISC_BARRIER_STORE;
46 lfds710_misc_force_store();