]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/inc/liblfds710/lfds710_list_addonly_singlylinked_ordered.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / inc / liblfds710 / lfds710_list_addonly_singlylinked_ordered.h
1 /***** defines *****/
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 )
10
11 /***** enums *****/
12 enum lfds710_list_aso_existing_key
13 {
14   LFDS710_LIST_ASO_EXISTING_KEY_OVERWRITE,
15   LFDS710_LIST_ASO_EXISTING_KEY_FAIL
16 };
17
18 enum lfds710_list_aso_insert_result
19 {
20   LFDS710_LIST_ASO_INSERT_RESULT_FAILURE_EXISTING_KEY,
21   LFDS710_LIST_ASO_INSERT_RESULT_SUCCESS_OVERWRITE,
22   LFDS710_LIST_ASO_INSERT_RESULT_SUCCESS
23 };
24
25 enum lfds710_list_aso_query
26 {
27   LFDS710_LIST_ASO_QUERY_GET_POTENTIALLY_INACCURATE_COUNT,
28   LFDS710_LIST_ASO_QUERY_SINGLETHREADED_VALIDATE
29 };
30
31 /***** structures *****/
32 struct lfds710_list_aso_element
33 {
34   struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_SINGLE_POINTER)
35     *volatile next;
36
37   void LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_SINGLE_POINTER)
38     *volatile value;
39
40   void
41     *key;
42 };
43
44 struct lfds710_list_aso_state
45 {
46   struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
47     dummy_element;
48
49   struct lfds710_list_aso_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
50     *start;
51
52   int
53     (*key_compare_function)( void const *new_key, void const *existing_key );
54
55   enum lfds710_list_aso_existing_key
56     existing_key;
57
58   void
59     *user_state;
60
61   struct lfds710_misc_backoff_state
62     insert_backoff;
63 };
64
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,
69                                                           void *user_state );
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
71
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) );
74
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 );
78
79 int lfds710_list_aso_get_by_key( struct lfds710_list_aso_state *lasos,
80                                  void *key,
81                                  struct lfds710_list_aso_element **lasoe );
82
83 void lfds710_list_aso_query( struct lfds710_list_aso_state *lasos,
84                              enum lfds710_list_aso_query query_type,
85                              void *query_input,
86                              void *query_output );
87