]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_queue.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / inc / liblfds700 / lfds700_queue.h
1 /***** defines *****/
2 #define LFDS700_QUEUE_GET_KEY_FROM_ELEMENT( queue_element )             ( (queue_element).key )
3 #define LFDS700_QUEUE_SET_KEY_IN_ELEMENT( queue_element, new_key )      ( (queue_element).key = (void *) (lfds700_pal_uint_t) (new_key) )
4 #define LFDS700_QUEUE_GET_VALUE_FROM_ELEMENT( queue_element )           ( (queue_element).value )
5 #define LFDS700_QUEUE_SET_VALUE_IN_ELEMENT( queue_element, new_value )  ( (queue_element).value = (void *) (lfds700_pal_uint_t) (new_value) )
6 #define LFDS700_QUEUE_GET_USER_STATE_FROM_STATE( queue_state )          ( (queue_state).user_state )
7
8 /***** enums *****/
9 enum lfds700_queue_query
10 {
11   LFDS700_QUEUE_QUERY_SINGLETHREADED_GET_COUNT,
12   LFDS700_QUEUE_QUERY_SINGLETHREADED_VALIDATE
13 };
14
15 /***** structures *****/
16 struct lfds700_queue_element
17 {
18   struct lfds700_queue_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
19     *volatile next[PAC_SIZE];
20
21   void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
22     *key;
23
24   void
25     *value;
26 };
27
28 struct lfds700_queue_state
29 {
30   struct lfds700_queue_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
31     *volatile enqueue[PAC_SIZE],
32     *volatile dequeue[PAC_SIZE];
33
34   void LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
35     *user_state;
36 };
37
38 /***** public prototypes *****/
39 void lfds700_queue_init_valid_on_current_logical_core( struct lfds700_queue_state *qs,
40                                                        struct lfds700_queue_element *qe_dummy,
41                                                        struct lfds700_misc_prng_state *ps,
42                                                        void *user_state );
43   // TRD : used in conjunction with the #define LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
44
45 void lfds700_queue_cleanup( struct lfds700_queue_state *qs,
46                             void (*element_cleanup_callback)(struct lfds700_queue_state *qs, struct lfds700_queue_element *qe, enum lfds700_misc_flag dummy_element_flag) );
47
48 void lfds700_queue_enqueue( struct lfds700_queue_state *qs,
49                             struct lfds700_queue_element *qe,
50                             struct lfds700_misc_prng_state *ps );
51
52 int lfds700_queue_dequeue( struct lfds700_queue_state *qs,
53                            struct lfds700_queue_element **qe,
54                            struct lfds700_misc_prng_state *ps );
55
56 void lfds700_queue_query( struct lfds700_queue_state *qs,
57                           enum lfds700_queue_query query_type,
58                           void *query_input,
59                           void *query_output );
60