]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/inc/liblfds710/lfds710_queue_bounded_manyproducer_manyconsumer.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / inc / liblfds710 / lfds710_queue_bounded_manyproducer_manyconsumer.h
1 /***** defines *****/
2 #define LFDS710_QUEUE_BMM_GET_USER_STATE_FROM_STATE( queue_bmm_state )  ( (queue_bmm_state).user_state )
3
4 /***** enums *****/
5 enum lfds710_queue_bmm_query
6 {
7   LFDS710_QUEUE_BMM_QUERY_GET_POTENTIALLY_INACCURATE_COUNT,
8   LFDS710_QUEUE_BMM_QUERY_SINGLETHREADED_VALIDATE
9 };
10
11 /***** structures *****/
12 struct lfds710_queue_bmm_element
13 {
14   lfds710_pal_uint_t volatile
15     sequence_number;
16
17   void
18     *volatile key,
19     *volatile value;
20 };
21
22 struct lfds710_queue_bmm_state
23 {
24   lfds710_pal_uint_t
25     number_elements,
26     mask;
27
28   lfds710_pal_uint_t volatile LFDS710_PAL_ALIGN(LFDS710_PAL_ATOMIC_ISOLATION_IN_BYTES)
29     read_index,
30     write_index;
31
32   struct lfds710_queue_bmm_element
33     *element_array;
34
35   void
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_bmm_init_valid_on_current_logical_core( struct lfds710_queue_bmm_state *qbmms,
45                                                            struct lfds710_queue_bmm_element *element_array,
46                                                            lfds710_pal_uint_t number_elements,
47                                                            void *user_state );
48
49 void lfds710_queue_bmm_cleanup( struct lfds710_queue_bmm_state *qbmms,
50                                 void (*element_cleanup_callback)(struct lfds710_queue_bmm_state *qbmms,
51                                                                  void *key,
52                                                                  void *value) );
53
54 int lfds710_queue_bmm_enqueue( struct lfds710_queue_bmm_state *qbmms,
55                                void *key,
56                                void *value );
57
58 int lfds710_queue_bmm_dequeue( struct lfds710_queue_bmm_state *qbmms,
59                                       void **key,
60                                       void **value );
61
62 void lfds710_queue_bmm_query( struct lfds710_queue_bmm_state *qbmms,
63                               enum lfds710_queue_bmm_query query_type,
64                               void *query_input,
65                               void *query_output );
66