2 #define LFDS710_LIST_ASO_GET_START( list_aso_state ) ( LFDS710_MISC_BARRIER_LOAD, (list_aso_state).start->next )
3 #define LFDS710_LIST_ASO_GET_NEXT( list_aso_element ) ( LFDS710_MISC_BARRIER_LOAD, (list_aso_element).next )
4 #define LFDS710_LIST_ASO_GET_START_AND_THEN_NEXT( list_aso_state, pointer_to_list_aso_element ) ( (pointer_to_list_aso_element) == NULL ? ( (pointer_to_list_aso_element) = LFDS710_LIST_ASO_GET_START(list_aso_state) ) : ( (pointer_to_list_aso_element) = LFDS710_LIST_ASO_GET_NEXT(*(pointer_to_list_aso_element)) ) )
5 #define LFDS710_LIST_ASO_GET_KEY_FROM_ELEMENT( list_aso_element ) ( (list_aso_element).key )
6 #define LFDS710_LIST_ASO_SET_KEY_IN_ELEMENT( list_aso_element, new_key ) ( (list_aso_element).key = (void *) (lfds710_pal_uint_t) (new_key) )
7 #define LFDS710_LIST_ASO_GET_VALUE_FROM_ELEMENT( list_aso_element ) ( LFDS710_MISC_BARRIER_LOAD, (list_aso_element).value )
8 #define LFDS710_LIST_ASO_SET_VALUE_IN_ELEMENT( list_aso_element, new_value ) { LFDS710_PAL_ATOMIC_SET( &(list_aso_element).value, new_value ); }
9 #define LFDS710_LIST_ASO_GET_USER_STATE_FROM_STATE( list_aso_state ) ( (list_aso_state).user_state )
12 enum lfds710_list_aso_existing_key
14 LFDS710_LIST_ASO_EXISTING_KEY_OVERWRITE,
15 LFDS710_LIST_ASO_EXISTING_KEY_FAIL
18 enum lfds710_list_aso_insert_result
20 LFDS710_LIST_ASO_INSERT_RESULT_FAILURE_EXISTING_KEY,
21 LFDS710_LIST_ASO_INSERT_RESULT_SUCCESS_OVERWRITE,
22 LFDS710_LIST_ASO_INSERT_RESULT_SUCCESS
25 enum lfds710_list_aso_query
27 LFDS710_LIST_ASO_QUERY_GET_POTENTIALLY_INACCURATE_COUNT,
28 LFDS710_LIST_ASO_QUERY_SINGLETHREADED_VALIDATE
31 /***** structures *****/
32 struct lfds710_list_aso_element
34 struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_SINGLE_POINTER)
37 void LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_SINGLE_POINTER)
44 struct lfds710_list_aso_state
46 struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
49 struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
53 (*key_compare_function)( void const *new_key, void const *existing_key );
55 enum lfds710_list_aso_existing_key
61 struct lfds710_misc_backoff_state
65 /***** public prototypes *****/
66 void lfds710_list_aso_init_valid_on_current_logical_core( struct lfds710_list_aso_state *lasos,
67 int (*key_compare_function)(void const *new_key, void const *existing_key),
68 enum lfds710_list_aso_existing_key existing_key,
70 // TRD : used in conjunction with the #define LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
72 void lfds710_list_aso_cleanup( struct lfds710_list_aso_state *lasos,
73 void (*element_cleanup_callback)(struct lfds710_list_aso_state *lasos, struct lfds710_list_aso_element *lasoe) );
75 enum lfds710_list_aso_insert_result lfds710_list_aso_insert( struct lfds710_list_aso_state *lasos,
76 struct lfds710_list_aso_element *lasoe,
77 struct lfds710_list_aso_element **existing_lasoe );
79 int lfds710_list_aso_get_by_key( struct lfds710_list_aso_state *lasos,
81 struct lfds710_list_aso_element **lasoe );
83 void lfds710_list_aso_query( struct lfds710_list_aso_state *lasos,
84 enum lfds710_list_aso_query query_type,