]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.0.0/liblfds700/inc/liblfds700/lfds700_ringbuffer.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.0.0 / liblfds700 / inc / liblfds700 / lfds700_ringbuffer.h
1 /***** enums *****/
2 #define LFDS700_RINGBUFFER_GET_USER_STATE_FROM_STATE( ringbuffer_state )  ( (ringbuffer_state).user_state )
3
4 /***** enums *****/
5 enum lfds700_ringbuffer_query
6 {
7   LFDS700_RINGBUFFER_QUERY_SINGLETHREADED_GET_COUNT,
8   LFDS700_RINGBUFFER_QUERY_SINGLETHREADED_VALIDATE
9 };
10
11 /***** structures *****/
12 struct lfds700_ringbuffer_element
13 {
14   struct lfds700_freelist_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
15     fe;
16
17   struct lfds700_queue_element LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
18     qe;
19
20   struct lfds700_queue_element
21     *qe_use; // TRD : hack for 7.0.0; we need a new queue with no dummy element
22
23   void
24     *key,
25     *value;
26 };
27
28 struct lfds700_ringbuffer_state
29 {
30   struct lfds700_freelist_state LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
31     fs;
32
33   struct lfds700_queue_state LFDS700_PAL_ALIGN(LFDS700_PAL_ATOMIC_ISOLATION_IN_BYTES)
34     qs;
35
36   void
37     (*element_cleanup_callback)( struct lfds700_ringbuffer_state *rs, void *key, void *value, enum lfds700_misc_flag unread_flag ),
38     *user_state;
39 };
40
41 /***** public prototypes *****/
42 void lfds700_ringbuffer_init_valid_on_current_logical_core( struct lfds700_ringbuffer_state *rs,
43                                                             struct lfds700_ringbuffer_element *re_array_inc_dummy,
44                                                             lfds700_pal_uint_t number_elements,
45                                                             struct lfds700_misc_prng_state *ps,
46                                                             void *user_state );
47   // TRD : used in conjunction with the #define LFDS700_MISC_MAKE_VALID_ON_CURRENT_LOGICAL_CORE_INITS_COMPLETED_BEFORE_NOW_ON_ANY_OTHER_LOGICAL_CORE
48
49 void lfds700_ringbuffer_cleanup( struct lfds700_ringbuffer_state *rs,
50                                  void (*element_cleanup_callback)(struct lfds700_ringbuffer_state *rs, void *key, void *value, enum lfds700_misc_flag unread_flag) );
51
52 int lfds700_ringbuffer_read( struct lfds700_ringbuffer_state *rs,
53                              void **key,
54                              void **value,
55                              struct lfds700_misc_prng_state *ps );
56
57 void lfds700_ringbuffer_write( struct lfds700_ringbuffer_state *rs,
58                                void *key,
59                                void *value,
60                                enum lfds700_misc_flag *overwrite_occurred_flag,
61                                void **overwritten_key,
62                                void **overwritten_value,
63                                struct lfds700_misc_prng_state *ps );
64
65 void lfds700_ringbuffer_query( struct lfds700_ringbuffer_state *rs,
66                                enum lfds700_ringbuffer_query query_type,
67                                void *query_input,
68                                void *query_output );
69