]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_freelist/lfds710_freelist_init.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_freelist / lfds710_freelist_init.c
1 /***** includes *****/
2 #include "lfds710_freelist_internal.h"
3
4
5
6
7
8 /****************************************************************************/
9 void lfds710_freelist_init_valid_on_current_logical_core( struct lfds710_freelist_state *fs,
10                                                           struct lfds710_freelist_element * volatile (*elimination_array)[LFDS710_FREELIST_ELIMINATION_ARRAY_ELEMENT_SIZE_IN_FREELIST_ELEMENTS],
11                                                           lfds710_pal_uint_t elimination_array_size_in_elements,
12                                                           void *user_state )
13 {
14   lfds710_pal_uint_t
15     loop,
16     subloop;
17
18   LFDS710_PAL_ASSERT( fs != NULL );
19   LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) fs->top % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
20   LFDS710_PAL_ASSERT( (lfds710_pal_uint_t) &fs->elimination_array_size_in_elements % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 );
21   // TRD : elimination_array can be NULL
22   LFDS710_PAL_ASSERT( (elimination_array == NULL) or 
23                       ( (elimination_array != NULL) and (lfds710_pal_uint_t) elimination_array % LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES == 0 ) );
24   LFDS710_PAL_ASSERT( (elimination_array == NULL and elimination_array_size_in_elements == 0) or 
25                       (elimination_array != NULL and elimination_array_size_in_elements >= 2 and (elimination_array_size_in_elements & (elimination_array_size_in_elements-1)) == 0) );
26   // TRD : user_state can be NULL
27
28   fs->top[POINTER] = NULL;
29   fs->top[COUNTER] = 0;
30
31   fs->elimination_array = elimination_array;
32   fs->elimination_array_size_in_elements = elimination_array_size_in_elements;
33   fs->user_state = user_state;
34
35   for( loop = 0 ; loop < elimination_array_size_in_elements ; loop++ )
36     for( subloop = 0 ; subloop < LFDS710_FREELIST_ELIMINATION_ARRAY_ELEMENT_SIZE_IN_FREELIST_ELEMENTS ; subloop++ )
37       fs->elimination_array[loop][subloop] = NULL;
38
39   lfds710_misc_internal_backoff_init( &fs->pop_backoff );
40   lfds710_misc_internal_backoff_init( &fs->push_backoff );
41
42   LFDS710_MISC_BARRIER_STORE;
43
44   lfds710_misc_force_store();
45
46   return;
47 }
48