]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_stack.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / inc / liblfds700 / lfds700_stack.h
1 /***** defines *****/
2 #define LFDS700_STACK_GET_KEY_FROM_ELEMENT( stack_element )             ( (stack_element).key )
3 #define LFDS700_STACK_SET_KEY_IN_ELEMENT( stack_element, new_key )      ( (stack_element).key = (void *) (lfds700_pal_uint_t) (new_key) )
4 #define LFDS700_STACK_GET_VALUE_FROM_ELEMENT( stack_element )           ( (stack_element).value )
5 #define LFDS700_STACK_SET_VALUE_IN_ELEMENT( stack_element, new_value )  ( (stack_element).value = (void *) (lfds700_pal_uint_t) (new_value) )
6 #define LFDS700_STACK_GET_USER_STATE_FROM_STATE( stack_state )          ( (stack_state).user_state )
7
8 /***** enums *****/
9 enum lfds700_stack_query
10 {
11   LFDS700_STACK_QUERY_SINGLETHREADED_GET_COUNT,
12   LFDS700_STACK_QUERY_SINGLETHREADED_VALIDATE
13 };
14
15 /***** structures *****/
16 struct lfds700_stack_element
17 {
18   struct lfds700_stack_element
19     *volatile next;
20
21   void
22     *key,
23     *value;
24 };
25
26 struct lfds700_stack_state
27 {
28   struct lfds700_stack_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
29     *volatile top[PAC_SIZE];
30
31   void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
32     *user_state;
33 };
34
35 /***** public prototypes *****/
36 void lfds700_stack_init_valid_on_current_logical_core( struct lfds700_stack_state *ss, 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
38
39 void lfds700_stack_cleanup( struct lfds700_stack_state *ss,
40                             void (*element_cleanup_callback)(struct lfds700_stack_state *ss, struct lfds700_stack_element *se) );
41
42 void lfds700_stack_push( struct lfds700_stack_state *ss,
43                          struct lfds700_stack_element *se,
44                          struct lfds700_misc_prng_state *ps );
45
46 int lfds700_stack_pop( struct lfds700_stack_state *ss,
47                        struct lfds700_stack_element **se,
48                        struct lfds700_misc_prng_state *ps );
49
50 void lfds700_stack_query( struct lfds700_stack_state *ss,
51                           enum lfds700_stack_query query_type,
52                           void *query_input,
53                           void *query_output );
54
55