2 #include "lfds710_freelist_internal.h"
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,
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
28 fs->top[POINTER] = NULL;
31 fs->elimination_array = elimination_array;
32 fs->elimination_array_size_in_elements = elimination_array_size_in_elements;
33 fs->user_state = user_state;
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;
39 lfds710_misc_internal_backoff_init( &fs->pop_backoff );
40 lfds710_misc_internal_backoff_init( &fs->push_backoff );
42 LFDS710_MISC_BARRIER_STORE;
44 lfds710_misc_force_store();