2 #define LFDS700_FREELIST_GET_KEY_FROM_ELEMENT( freelist_element ) ( (freelist_element).key )
3 #define LFDS700_FREELIST_SET_KEY_IN_ELEMENT( freelist_element, new_key ) ( (freelist_element).key = (void *) (lfds700_pal_uint_t) (new_key) )
4 #define LFDS700_FREELIST_GET_VALUE_FROM_ELEMENT( freelist_element ) ( (freelist_element).value )
5 #define LFDS700_FREELIST_SET_VALUE_IN_ELEMENT( freelist_element, new_value ) ( (freelist_element).value = (void *) (lfds700_pal_uint_t) (new_value) )
6 #define LFDS700_FREELIST_GET_USER_STATE_FROM_STATE( freelist_state ) ( (freelist_state).user_state )
9 enum lfds700_freelist_query
11 LFDS700_FREELIST_QUERY_SINGLETHREADED_GET_COUNT,
12 LFDS700_FREELIST_QUERY_SINGLETHREADED_VALIDATE
15 /***** structures *****/
16 struct lfds700_freelist_element
18 struct lfds700_freelist_element
26 struct lfds700_freelist_state
28 struct lfds700_freelist_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
29 *volatile top[PAC_SIZE];
31 void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
35 /***** public prototypes *****/
36 void lfds700_freelist_init_valid_on_current_logical_core( struct lfds700_freelist_state *fs, void *user_state );
37 // TRD : used in conjunction with the #define LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
39 void lfds700_freelist_cleanup( struct lfds700_freelist_state *fs,
40 void (*element_cleanup_callback)(struct lfds700_freelist_state *fs, struct lfds700_freelist_element *fe) );
42 void lfds700_freelist_push( struct lfds700_freelist_state *fs,
43 struct lfds700_freelist_element *fe,
44 struct lfds700_misc_prng_state *ps );
46 int lfds700_freelist_pop( struct lfds700_freelist_state *fs,
47 struct lfds700_freelist_element **fe,
48 struct lfds700_misc_prng_state *ps );
50 void lfds700_freelist_query( struct lfds700_freelist_state *fs,
51 enum lfds700_freelist_query query_type,