]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/inc/liblfds601.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / inc / liblfds601.h
1 #ifndef __LIBLFDS601_H
2
3   /***** library header *****/
4   #define LFDS601_RELEASE_NUMBER_STRING  "6.0.1"
5
6
7
8
9   /***** lfds601_abstraction *****/
10
11   /***** defines *****/
12   #if (defined _WIN64 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)
13     // TRD : 64-bit Windows user-mode with the Microsoft C compiler, any CPU
14     #include <assert.h>
15     #include <stdio.h>
16     #include <stdlib.h>
17     #include <windows.h>
18     #include <intrin.h>
19     typedef unsigned __int64              lfds601_atom_t;
20     #define LFDS601_INLINE                extern __forceinline
21     #define LFDS601_ALIGN(alignment)      __declspec( align(alignment) )
22     #define LFDS601_ALIGN_SINGLE_POINTER  8
23     #define LFDS601_ALIGN_DOUBLE_POINTER  16
24   #endif
25
26   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)
27     // TRD : 32-bit Windows user-mode with the Microsoft C compiler, any CPU
28     #include <assert.h>
29     #include <stdio.h>
30     #include <stdlib.h>
31     #include <windows.h>
32     #include <intrin.h>
33     typedef unsigned long int             lfds601_atom_t;
34     #define LFDS601_INLINE                extern __forceinline
35     #define LFDS601_ALIGN(alignment)      __declspec( align(alignment) )
36     #define LFDS601_ALIGN_SINGLE_POINTER  4
37     #define LFDS601_ALIGN_DOUBLE_POINTER  8
38
39     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0
40     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)
41   #endif
42
43   #if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
44     // TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU
45     #include <assert.h>
46     #include <stdio.h>
47     #include <stdlib.h>
48     #include <wdm.h>
49     typedef unsigned __int64              lfds601_atom_t;
50     #define LFDS601_INLINE                extern __forceinline
51     #define LFDS601_ALIGN(alignment)      __declspec( align(alignment) )
52     #define LFDS601_ALIGN_SINGLE_POINTER  8
53     #define LFDS601_ALIGN_DOUBLE_POINTER  16
54   #endif
55
56   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
57     // TRD : 32-bit Windows kernel with the Microsoft C compiler, any CPU
58     #include <assert.h>
59     #include <stdio.h>
60     #include <stdlib.h>
61     #include <wdm.h>
62     typedef unsigned long int             lfds601_atom_t;
63     #define LFDS601_INLINE                extern __forceinline
64     #define LFDS601_ALIGN(alignment)      __declspec( align(alignment) )
65     #define LFDS601_ALIGN_SINGLE_POINTER  4
66     #define LFDS601_ALIGN_DOUBLE_POINTER  8
67
68     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0
69     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)
70   #endif
71
72   #if (defined __unix__ && defined __x86_64__ && __GNUC__)
73     // TRD : any UNIX with GCC on x64
74     #define _XOPEN_SOURCE 600
75     #include <assert.h>
76     #include <stdio.h>
77     #include <stdlib.h>
78     typedef unsigned long long int        lfds601_atom_t;
79     #define LFDS601_INLINE                inline
80     #define LFDS601_ALIGN(alignment)      __attribute__( (aligned(alignment)) )
81     #define LFDS601_ALIGN_SINGLE_POINTER  8
82     #define LFDS601_ALIGN_DOUBLE_POINTER  16
83   #endif
84
85   #if (defined __unix__ && defined __i686__ && __GNUC__)
86     // TRD : any UNIX with GCC on x86
87     #define _XOPEN_SOURCE 600
88     #include <assert.h>
89     #include <stdio.h>
90     #include <stdlib.h>
91     typedef unsigned long int             lfds601_atom_t;
92     #define LFDS601_INLINE                inline
93     #define LFDS601_ALIGN(alignment)      __attribute__( (aligned(alignment)) )
94     #define LFDS601_ALIGN_SINGLE_POINTER  4
95     #define LFDS601_ALIGN_DOUBLE_POINTER  8
96   #endif
97
98   #if (defined __unix__ && defined __arm__ && __GNUC__)
99     // TRD : any UNIX with GCC on ARM
100     #define _XOPEN_SOURCE 600
101     #include <assert.h>
102     #include <stdio.h>
103     #include <stdlib.h>
104     typedef unsigned long int             lfds601_atom_t;
105     #define LFDS601_INLINE                inline
106     #define LFDS601_ALIGN(alignment)      __attribute__( (aligned(alignment)) )
107     #define LFDS601_ALIGN_SINGLE_POINTER  4
108     #define LFDS601_ALIGN_DOUBLE_POINTER  8
109   #endif
110
111   /***** enums *****/
112   enum lfds601_data_structure_validity
113   {
114     LFDS601_VALIDITY_VALID,
115     LFDS601_VALIDITY_INVALID_LOOP,
116     LFDS601_VALIDITY_INVALID_MISSING_ELEMENTS,
117     LFDS601_VALIDITY_INVALID_ADDITIONAL_ELEMENTS,
118     LFDS601_VALIDITY_INVALID_TEST_DATA
119   };
120
121   /***** structs *****/
122   struct lfds601_validation_info
123   {
124     lfds601_atom_t
125       min_elements,
126       max_elements;
127   };
128
129   /***** public prototypes *****/
130   void lfds601_abstraction_aligned_free( void *memory );
131   void *lfds601_abstraction_aligned_malloc( size_t size, size_t align_in_bytes );
132   lfds601_atom_t lfds601_abstraction_cas( volatile lfds601_atom_t *destination, lfds601_atom_t exchange, lfds601_atom_t compare );
133   unsigned char lfds601_abstraction_dcas( volatile lfds601_atom_t *destination, lfds601_atom_t *exchange, lfds601_atom_t *compare );
134   lfds601_atom_t lfds601_abstraction_increment( lfds601_atom_t *value );
135
136
137
138
139
140   /***** lfds601_freelist *****/
141
142   /***** enums *****/
143   enum lfds601_freelist_query_type
144   {
145     LFDS601_FREELIST_QUERY_ELEMENT_COUNT,
146     LFDS601_FREELIST_QUERY_VALIDATE
147   };
148
149   /***** incomplete types *****/
150   struct lfds601_freelist_state;
151   struct lfds601_freelist_element;
152
153   /***** public prototypes *****/
154   int lfds601_freelist_new( struct lfds601_freelist_state **fs, lfds601_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );
155   void lfds601_freelist_delete( struct lfds601_freelist_state *fs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
156
157   lfds601_atom_t lfds601_freelist_new_elements( struct lfds601_freelist_state *fs, lfds601_atom_t number_elements );
158
159   struct lfds601_freelist_element *lfds601_freelist_pop( struct lfds601_freelist_state *fs, struct lfds601_freelist_element **fe );
160   struct lfds601_freelist_element *lfds601_freelist_guaranteed_pop( struct lfds601_freelist_state *fs, struct lfds601_freelist_element **fe );
161   void lfds601_freelist_push( struct lfds601_freelist_state *fs, struct lfds601_freelist_element *fe );
162
163   void *lfds601_freelist_get_user_data_from_element( struct lfds601_freelist_element *fe, void **user_data );
164   void lfds601_freelist_set_user_data_in_element( struct lfds601_freelist_element *fe, void *user_data );
165
166   void lfds601_freelist_query( struct lfds601_freelist_state *fs, enum lfds601_freelist_query_type query_type, void *query_input, void *query_output );
167
168
169
170
171
172   /***** lfds601_queue *****/
173
174   /***** enums *****/
175   enum lfds601_queue_query_type
176   {
177     LFDS601_QUEUE_QUERY_ELEMENT_COUNT,
178     LFDS601_QUEUE_QUERY_VALIDATE
179   };
180
181   /***** incomplete types *****/
182   struct lfds601_queue_state;
183
184   /***** public prototypes *****/
185   int lfds601_queue_new( struct lfds601_queue_state **sq, lfds601_atom_t number_elements );
186   void lfds601_queue_delete( struct lfds601_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
187
188   int lfds601_queue_enqueue( struct lfds601_queue_state *qs, void *user_data );
189   int lfds601_queue_guaranteed_enqueue( struct lfds601_queue_state *qs, void *user_data );
190   int lfds601_queue_dequeue( struct lfds601_queue_state *qs, void **user_data );
191
192   void lfds601_queue_query( struct lfds601_queue_state *qs, enum lfds601_queue_query_type query_type, void *query_input, void *query_output );
193
194
195
196
197
198   /***** lfds601_ringbuffer *****/
199
200   /***** enums *****/
201   enum lfds601_ringbuffer_query_type
202   {
203     LFDS601_RINGBUFFER_QUERY_VALIDATE
204   };
205
206   /***** incomplete types *****/
207   struct lfds601_ringbuffer_state;
208
209   /***** public prototypes *****/
210   int lfds601_ringbuffer_new( struct lfds601_ringbuffer_state **rs, lfds601_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );
211   void lfds601_ringbuffer_delete( struct lfds601_ringbuffer_state *rs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
212
213   struct lfds601_freelist_element *lfds601_ringbuffer_get_read_element( struct lfds601_ringbuffer_state *rs, struct lfds601_freelist_element **fe );
214   struct lfds601_freelist_element *lfds601_ringbuffer_get_write_element( struct lfds601_ringbuffer_state *rs, struct lfds601_freelist_element **fe, int *overwrite_flag );
215
216   void lfds601_ringbuffer_put_read_element( struct lfds601_ringbuffer_state *rs, struct lfds601_freelist_element *fe );
217   void lfds601_ringbuffer_put_write_element( struct lfds601_ringbuffer_state *rs, struct lfds601_freelist_element *fe );
218
219   void lfds601_ringbuffer_query( struct lfds601_ringbuffer_state *rs, enum lfds601_ringbuffer_query_type query_type, void *query_input, void *query_output );
220
221
222
223
224
225   /***** lfds601_slist *****/
226
227   /***** incomplete types *****/
228   struct lfds601_slist_state;
229   struct lfds601_slist_element;
230
231   /***** public prototypes *****/
232   int lfds601_slist_new( struct lfds601_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
233   void lfds601_slist_delete( struct lfds601_slist_state *ss );
234
235   struct lfds601_slist_element *lfds601_slist_new_head( struct lfds601_slist_state *ss, void *user_data );
236   struct lfds601_slist_element *lfds601_slist_new_next( struct lfds601_slist_element *se, void *user_data );
237
238   void lfds601_slist_delete_element( struct lfds601_slist_state *ss, struct lfds601_slist_element *se );
239   void lfds601_slist_delete_all_elements( struct lfds601_slist_state *ss );
240
241   int lfds601_slist_get_user_data_from_element( struct lfds601_slist_element *se, void **user_data );
242   int lfds601_slist_set_user_data_in_element( struct lfds601_slist_element *se, void *user_data );
243
244   struct lfds601_slist_element *lfds601_slist_get_head( struct lfds601_slist_state *ss, struct lfds601_slist_element **se );
245   struct lfds601_slist_element *lfds601_slist_get_next( struct lfds601_slist_element *se, struct lfds601_slist_element **next_se );
246   struct lfds601_slist_element *lfds601_slist_get_head_and_then_next( struct lfds601_slist_state *ss, struct lfds601_slist_element **se );
247
248
249
250
251
252   /***** lfds601_stack *****/
253
254   /***** enums *****/
255   enum lfds601_stack_query_type
256   {
257     LFDS601_STACK_QUERY_ELEMENT_COUNT
258   };
259
260   /***** incomplete types *****/
261   struct lfds601_stack_state;
262
263   /***** public prototypes *****/
264   int lfds601_stack_new( struct lfds601_stack_state **ss, lfds601_atom_t number_elements );
265   void lfds601_stack_delete( struct lfds601_stack_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
266
267   void lfds601_stack_clear( struct lfds601_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state );
268
269   int lfds601_stack_push( struct lfds601_stack_state *ss, void *user_data );
270   int lfds601_stack_guaranteed_push( struct lfds601_stack_state *ss, void *user_data );
271   int lfds601_stack_pop( struct lfds601_stack_state *ss, void **user_data );
272
273   void lfds601_stack_query( struct lfds601_stack_state *ss, enum lfds601_stack_query_type query_type, void *query_input, void *query_output );
274
275
276
277
278
279   #define __LIBLFDS601_H
280
281 #endif
282