]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_queue_unbounded_manyproducer_manyconsumer/lfds710_queue_unbounded_manyproducer_manyconsumer_init.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_queue_unbounded_manyproducer_manyconsumer / lfds710_queue_unbounded_manyproducer_manyconsumer_init.c
1 /***** includes *****/
2 #include "lfds710_queue_unbounded_manyproducer_manyconsumer_internal.h"
3
4
5
6
7
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,
11                                                            void *user_state )
12 {
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
20
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
24   */
25
26   LFDS710_PRNG_GENERATE( lfds710_misc_globals.ps, qumms->aba_counter );
27
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;
32
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;
38
39   qumms->user_state = user_state;
40
41   lfds710_misc_internal_backoff_init( &qumms->dequeue_backoff );
42   lfds710_misc_internal_backoff_init( &qumms->enqueue_backoff );
43
44   LFDS710_MISC_BARRIER_STORE;
45
46   lfds710_misc_force_store();
47
48   return;
49 }
50