]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/inc/liblfds710/lfds710_queue_unbounded_manyproducer_manyconsumer.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / inc / liblfds710 / lfds710_queue_unbounded_manyproducer_manyconsumer.h
1 /***** defines *****/
2 #define LFDS710_QUEUE_UMM_GET_KEY_FROM_ELEMENT( queue_umm_element )             ( (queue_umm_element).key )
3 #define LFDS710_QUEUE_UMM_SET_KEY_IN_ELEMENT( queue_umm_element, new_key )      ( (queue_umm_element).key = (void *) (lfds710_pal_uint_t) (new_key) )
4 #define LFDS710_QUEUE_UMM_GET_VALUE_FROM_ELEMENT( queue_umm_element )           ( (queue_umm_element).value )
5 #define LFDS710_QUEUE_UMM_SET_VALUE_IN_ELEMENT( queue_umm_element, new_value )  ( (queue_umm_element).value = (void *) (lfds710_pal_uint_t) (new_value) )
6 #define LFDS710_QUEUE_UMM_GET_USER_STATE_FROM_STATE( queue_umm_state )          ( (queue_umm_state).user_state )
7
8 /***** enums *****/
9 enum lfds710_queue_umm_query
10 {
11   LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_GET_COUNT,
12   LFDS710_QUEUE_UMM_QUERY_SINGLETHREADED_VALIDATE
13 };
14
15 /***** structures *****/
16 struct lfds710_queue_umm_element
17 {
18   struct lfds710_queue_umm_element LFDS710_PAL_ALIGN(LFDS710_PAL_ALIGN_DOUBLE_POINTER)
19     *volatile next[PAC_SIZE];
20
21   void
22     *key,
23     *value;
24 };
25
26 struct lfds710_queue_umm_state
27 {
28   struct lfds710_queue_umm_element LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
29     *volatile enqueue[PAC_SIZE],
30     *volatile dequeue[PAC_SIZE];
31
32   lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
33     aba_counter;
34
35   void LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
36     *user_state;
37
38   struct lfds710_misc_backoff_state
39     dequeue_backoff,
40     enqueue_backoff;
41 };
42
43 /***** public prototypes *****/
44 void lfds710_queue_umm_init_valid_on_current_logical_core( struct lfds710_queue_umm_state *qumms,
45                                                            struct lfds710_queue_umm_element *qumme_dummy,
46                                                            void *user_state );
47   // TRD : used in conjunction with the #define LFDS710_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
48
49 void lfds710_queue_umm_cleanup( struct lfds710_queue_umm_state *qumms,
50                                 void (*element_cleanup_callback)(struct lfds710_queue_umm_state *qumms, struct lfds710_queue_umm_element *qumme, enum lfds710_misc_flag dummy_element_flag) );
51
52 void lfds710_queue_umm_enqueue( struct lfds710_queue_umm_state *qumms,
53                                 struct lfds710_queue_umm_element *qumme );
54
55 int lfds710_queue_umm_dequeue( struct lfds710_queue_umm_state *qumms,
56                                struct lfds710_queue_umm_element **qumme );
57
58 void lfds710_queue_umm_query( struct lfds710_queue_umm_state *qumms,
59                               enum lfds710_queue_umm_query query_type,
60                               void *query_input,
61                               void *query_output );
62