]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/inc/liblfds710/lfds710_freelist.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / inc / liblfds710 / lfds710_freelist.h
1 /***** defines *****/
2 #define LFDS710_FREELIST_GET_KEY_FROM_ELEMENT( freelist_element )             ( (freelist_element).key )
3 #define LFDS710_FREELIST_SET_KEY_IN_ELEMENT( freelist_element, new_key )      ( (freelist_element).key = (void *) (lfds710_pal_uint_t) (new_key) )
4 #define LFDS710_FREELIST_GET_VALUE_FROM_ELEMENT( freelist_element )           ( (freelist_element).value )
5 #define LFDS710_FREELIST_SET_VALUE_IN_ELEMENT( freelist_element, new_value )  ( (freelist_element).value = (void *) (lfds710_pal_uint_t) (new_value) )
6 #define LFDS710_FREELIST_GET_USER_STATE_FROM_STATE( freelist_state )          ( (freelist_state).user_state )
7
8 #define LFDS710_FREELIST_ELIMINATION_ARRAY_ELEMENT_SIZE_IN_FREELIST_ELEMENTS  ( LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES / sizeof(struct lfds710_freelist_element *) )
9
10 /***** enums *****/
11 enum lfds710_freelist_query
12 {
13   LFDS710_FREELIST_QUERY_SINGLETHREADED_GET_COUNT,
14   LFDS710_FREELIST_QUERY_SINGLETHREADED_VALIDATE,
15   LFDS710_FREELIST_QUERY_GET_ELIMINATION_ARRAY_EXTRA_ELEMENTS_IN_FREELIST_ELEMENTS
16 };
17
18 /***** structures *****/
19 struct lfds710_freelist_element
20 {
21   struct lfds710_freelist_element
22     *next;
23
24   void
25     *key,
26     *value;
27 };
28
29 struct lfds710_freelist_state
30 {
31   struct lfds710_freelist_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
32     *volatile top[PAC_SIZE];
33
34   lfds710_pal_uint_t LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
35     elimination_array_size_in_elements;
36
37   struct lfds710_freelist_element * volatile
38     (*elimination_array)[LFDS710_FREELIST_ELIMINATION_ARRAY_ELEMENT_SIZE_IN_FREELIST_ELEMENTS];
39
40   void
41     *user_state;
42
43   struct lfds710_misc_backoff_state
44     pop_backoff,
45     push_backoff;
46 };
47
48 /***** public prototypes *****/
49 void lfds710_freelist_init_valid_on_current_logical_core( struct lfds710_freelist_state *fs,
50                                                           struct lfds710_freelist_element * volatile (*elimination_array)[LFDS710_FREELIST_ELIMINATION_ARRAY_ELEMENT_SIZE_IN_FREELIST_ELEMENTS],
51                                                           lfds710_pal_uint_t elimination_array_size_in_elements,
52                                                           void *user_state );
53   // TRD : used in conjunction with the #define LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
54
55 void lfds710_freelist_cleanup( struct lfds710_freelist_state *fs,
56                                void (*element_cleanup_callback)(struct lfds710_freelist_state *fs, struct lfds710_freelist_element *fe) );
57
58 void lfds710_freelist_push( struct lfds710_freelist_state *fs,
59                                    struct lfds710_freelist_element *fe,
60                                    struct lfds710_prng_st_state *psts );
61
62 int lfds710_freelist_pop( struct lfds710_freelist_state *fs,
63                           struct lfds710_freelist_element **fe,
64                           struct lfds710_prng_st_state *psts );
65
66 void lfds710_freelist_query( struct lfds710_freelist_state *fs,
67                              enum lfds710_freelist_query query_type,
68                              void *query_input,
69                              void *query_output );
70