]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_list_addonly_singlylinked_unordered.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / inc / liblfds700 / lfds700_list_addonly_singlylinked_unordered.h
1 /***** defines *****/
2 #define LFDS700_LIST_ASU_GET_START( list_asu_state )                                             ( LFDS700_MISC_BARRIER_LOAD, (list_asu_state).start->next )
3 #define LFDS700_LIST_ASU_GET_NEXT( list_asu_element )                                            ( LFDS700_MISC_BARRIER_LOAD, (list_asu_element).next )
4 #define LFDS700_LIST_ASU_GET_START_AND_THEN_NEXT( list_asu_state, pointer_to_list_asu_element )  ( (pointer_to_list_asu_element) == NULL ? ( (pointer_to_list_asu_element) = LFDS700_LIST_ASU_GET_START(list_asu_state) ) : ( (pointer_to_list_asu_element) = LFDS700_LIST_ASU_GET_NEXT(*(pointer_to_list_asu_element)) ) )
5 #define LFDS700_LIST_ASU_GET_KEY_FROM_ELEMENT( list_asu_element )                                ( (list_asu_element).key )
6 #define LFDS700_LIST_ASU_SET_KEY_IN_ELEMENT( list_asu_element, new_key )                         ( (list_asu_element).key = (void *) (lfds700_pal_uint_t) (new_key) )
7 #define LFDS700_LIST_ASU_GET_VALUE_FROM_ELEMENT( list_asu_element )                              ( LFDS700_MISC_BARRIER_LOAD, (list_asu_element).value )
8 #define LFDS700_LIST_ASU_SET_VALUE_IN_ELEMENT( list_asu_element, new_value )                     { void *local_new_value = (void *) (lfds700_pal_uint_t) (new_value); LFDS700_PAL_ATOMIC_EXCHANGE( &(list_asu_element).value, &local_new_value ); }
9 #define LFDS700_LIST_ASU_GET_USER_STATE_FROM_STATE( list_asu_state )                             ( (list_asu_state).user_state )
10
11 /***** enums *****/
12 enum lfds700_list_asu_position
13 {
14   LFDS700_LIST_ASU_POSITION_START,
15   LFDS700_LIST_ASU_POSITION_END,
16   LFDS700_LIST_ASU_POSITION_AFTER
17 };
18
19 enum lfds700_list_asu_query
20 {
21   LFDS700_LIST_ASU_QUERY_GET_POTENTIALLY_INACCURATE_COUNT,
22   LFDS700_LIST_ASU_QUERY_SINGLETHREADED_VALIDATE
23 };
24
25 /***** structures *****/
26 struct lfds700_list_asu_element
27 {
28   struct lfds700_list_asu_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
29     *volatile next;
30
31   void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
32     *volatile value;
33
34   void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
35     *key;
36 };
37
38 struct lfds700_list_asu_state
39 {
40   struct lfds700_list_asu_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
41     *volatile end,
42     *volatile start;
43
44   struct lfds700_list_asu_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
45     dummy_element;
46
47   int LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
48     (*key_compare_function)( void const *new_key, void const *existing_key );
49
50   void
51     *user_state;
52 };
53
54 /***** public prototypes *****/
55 void lfds700_list_asu_init_valid_on_current_logical_core( struct lfds700_list_asu_state *lasus,
56                                                           int (*key_compare_function)(void const *new_key, void const *existing_key),
57                                                           void *user_state );
58   // TRD : used in conjunction with the #define LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
59
60 void lfds700_list_asu_cleanup( struct lfds700_list_asu_state *lasus,
61                                void (*element_cleanup_callback)(struct lfds700_list_asu_state *lasus, struct lfds700_list_asu_element *lasue) );
62
63 void lfds700_list_asu_insert_at_position( struct lfds700_list_asu_state *lasus,
64                                           struct lfds700_list_asu_element *lasue,
65                                           struct lfds700_list_asu_element *lasue_predecessor,
66                                           enum lfds700_list_asu_position position,
67                                           struct lfds700_misc_prng_state *ps );
68
69 void lfds700_list_asu_insert_at_start( struct lfds700_list_asu_state *lasus,
70                                        struct lfds700_list_asu_element *lasue,
71                                        struct lfds700_misc_prng_state *ps );
72
73 void lfds700_list_asu_insert_at_end( struct lfds700_list_asu_state *lasus,
74                                      struct lfds700_list_asu_element *lasue,
75                                      struct lfds700_misc_prng_state *ps );
76
77 void lfds700_list_asu_insert_after_element( struct lfds700_list_asu_state *lasus,
78                                             struct lfds700_list_asu_element *lasue,
79                                             struct lfds700_list_asu_element *lasue_predecessor,
80                                             struct lfds700_misc_prng_state *ps );
81
82 int lfds700_list_asu_get_by_key( struct lfds700_list_asu_state *lasus,
83                                  void *key,
84                                  struct lfds700_list_asu_element **lasue );
85
86 void lfds700_list_asu_query( struct lfds700_list_asu_state *lasus,
87                              enum lfds700_list_asu_query query_type,
88                              void *query_input,
89                              void *query_output );
90