]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_queue_bounded_manyproducer_manyconsumer/lfds710_queue_bounded_manyproducer_manyconsumer_init.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_queue_bounded_manyproducer_manyconsumer / lfds710_queue_bounded_manyproducer_manyconsumer_init.c
1 /***** includes *****/
2 #include "lfds710_queue_bounded_manyproducer_manyconsumer_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void lfds710_queue_bmm_init_valid_on_current_logical_core( struct lfds710_queue_bmm_state *qbmms,
10                                                            struct lfds710_queue_bmm_element *element_array,
11                                                            lfds710_pal_uint_t number_elements,
12                                                            void *user_state )
13 {
14   lfds710_pal_uint_t
15     loop;
16
17   LFDS710_PAL_ASSERT( qbmms != NULL );
18   LFDS710_PAL_ASSERT( element_array != NULL );
19   LFDS710_PAL_ASSERT( number_elements >= 2 );
20   LFDS710_PAL_ASSERT( ( number_elements & (number_elements-1) ) == 0 ); // TRD : number_elements must be a positive integer power of 2
21   // TRD : user_state can be NULL
22
23   qbmms->number_elements = number_elements;
24   qbmms->mask = qbmms->number_elements - 1;
25   qbmms->read_index = 0;
26   qbmms->write_index = 0;
27   qbmms->element_array = element_array;
28   qbmms->user_state = user_state;
29
30   for( loop = 0 ; loop < qbmms->number_elements ; loop++ )
31     qbmms->element_array[loop].sequence_number = loop;
32
33   lfds710_misc_internal_backoff_init( &qbmms->dequeue_backoff );
34   lfds710_misc_internal_backoff_init( &qbmms->enqueue_backoff );
35
36   LFDS710_MISC_BARRIER_STORE;
37
38   lfds710_misc_force_store();
39
40   return;
41 }
42