]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/inc/liblfds610.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / inc / liblfds610.h
1 #ifndef __LIBLFDS610_H
2
3   /***** library header *****/
4   #define LFDS610_RELEASE_NUMBER_STRING  "6.1.0"
5
6
7
8
9   /***** lfds610_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                 lfds610_atom_t;
20     #define LFDS610_INLINE                   __forceinline
21     #define LFDS610_ALIGN(alignment)         __declspec( align(alignment) )
22     #define LFDS610_ALIGN_SINGLE_POINTER     8
23     #define LFDS610_ALIGN_DOUBLE_POINTER     16
24     #define LFDS610_BARRIER_COMPILER_LOAD    _ReadBarrier()
25     #define LFDS610_BARRIER_COMPILER_STORE   _WriteBarrier()
26     #define LFDS610_BARRIER_COMPILER_FULL    _ReadWriteBarrier()
27     #define LFDS610_BARRIER_PROCESSOR_LOAD   _mm_lfence()
28     #define LFDS610_BARRIER_PROCESSOR_STORE  _mm_sfence()
29     #define LFDS610_BARRIER_PROCESSOR_FULL   _mm_mfence()
30   #endif
31
32   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)
33     // TRD : 32-bit Windows user-mode with the Microsoft C compiler, any CPU
34     #include <assert.h>
35     #include <stdio.h>
36     #include <stdlib.h>
37     #include <windows.h>
38     #include <intrin.h>
39     typedef unsigned long int                lfds610_atom_t;
40     #define LFDS610_INLINE                   __forceinline
41     #define LFDS610_ALIGN(alignment)         __declspec( align(alignment) )
42     #define LFDS610_ALIGN_SINGLE_POINTER     4
43     #define LFDS610_ALIGN_DOUBLE_POINTER     8
44     #define LFDS610_BARRIER_COMPILER_LOAD    _ReadBarrier()
45     #define LFDS610_BARRIER_COMPILER_STORE   _WriteBarrier()
46     #define LFDS610_BARRIER_COMPILER_FULL    _ReadWriteBarrier()
47     #define LFDS610_BARRIER_PROCESSOR_LOAD   _mm_lfence()
48     #define LFDS610_BARRIER_PROCESSOR_STORE  _mm_sfence()
49     #define LFDS610_BARRIER_PROCESSOR_FULL   _mm_mfence()
50
51     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0
52     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)
53   #endif
54
55   #if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
56     // TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU
57     #include <assert.h>
58     #include <stdio.h>
59     #include <stdlib.h>
60     #include <wdm.h>
61     typedef unsigned __int64                 lfds610_atom_t;
62     #define LFDS610_INLINE                   __forceinline
63     #define LFDS610_ALIGN(alignment)         __declspec( align(alignment) )
64     #define LFDS610_ALIGN_SINGLE_POINTER     8
65     #define LFDS610_ALIGN_DOUBLE_POINTER     16
66     #define LFDS610_BARRIER_COMPILER_LOAD    _ReadBarrier()
67     #define LFDS610_BARRIER_COMPILER_STORE   _WriteBarrier()
68     #define LFDS610_BARRIER_COMPILER_FULL    _ReadWriteBarrier()
69     #define LFDS610_BARRIER_PROCESSOR_LOAD   _mm_lfence()
70     #define LFDS610_BARRIER_PROCESSOR_STORE  _mm_sfence()
71     #define LFDS610_BARRIER_PROCESSOR_FULL   _mm_mfence()
72   #endif
73
74   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
75     // TRD : 32-bit Windows kernel with the Microsoft C compiler, any CPU
76     #include <assert.h>
77     #include <stdio.h>
78     #include <stdlib.h>
79     #include <wdm.h>
80     typedef unsigned long int                lfds610_atom_t;
81     #define LFDS610_INLINE                   __forceinline
82     #define LFDS610_ALIGN(alignment)         __declspec( align(alignment) )
83     #define LFDS610_ALIGN_SINGLE_POINTER     4
84     #define LFDS610_ALIGN_DOUBLE_POINTER     8
85     #define LFDS610_BARRIER_COMPILER_LOAD    _ReadBarrier()
86     #define LFDS610_BARRIER_COMPILER_STORE   _WriteBarrier()
87     #define LFDS610_BARRIER_COMPILER_FULL    _ReadWriteBarrier()
88     #define LFDS610_BARRIER_PROCESSOR_LOAD   _mm_lfence()
89     #define LFDS610_BARRIER_PROCESSOR_STORE  _mm_sfence()
90     #define LFDS610_BARRIER_PROCESSOR_FULL   _mm_mfence()
91
92     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0
93     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)
94   #endif
95
96   #if (defined __unix__ && defined __x86_64__ && __GNUC__)
97     // TRD : any UNIX with GCC on x64
98     #include <assert.h>
99     #include <stdio.h>
100     #include <stdlib.h>
101     typedef unsigned long long int           lfds610_atom_t;
102     #define LFDS610_INLINE                   inline
103     #define LFDS610_ALIGN(alignment)         __attribute__( (aligned(alignment)) )
104     #define LFDS610_ALIGN_SINGLE_POINTER     8
105     #define LFDS610_ALIGN_DOUBLE_POINTER     16
106     #define LFDS610_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )
107     #define LFDS610_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )
108     #define LFDS610_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )
109     #define LFDS610_BARRIER_PROCESSOR_LOAD   __sync_synchronize()
110     #define LFDS610_BARRIER_PROCESSOR_STORE  __sync_synchronize()
111     #define LFDS610_BARRIER_PROCESSOR_FULL   __sync_synchronize()
112   #endif
113
114   #if (defined __unix__ && defined __i686__ && __GNUC__)
115     // TRD : any UNIX with GCC on x86
116     #include <assert.h>
117     #include <stdio.h>
118     #include <stdlib.h>
119     typedef unsigned long int                lfds610_atom_t;
120     #define LFDS610_INLINE                   inline
121     #define LFDS610_ALIGN(alignment)         __attribute__( (aligned(alignment)) )
122     #define LFDS610_ALIGN_SINGLE_POINTER     4
123     #define LFDS610_ALIGN_DOUBLE_POINTER     8
124     #define LFDS610_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )
125     #define LFDS610_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )
126     #define LFDS610_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )
127     #define LFDS610_BARRIER_PROCESSOR_LOAD   __sync_synchronize()
128     #define LFDS610_BARRIER_PROCESSOR_STORE  __sync_synchronize()
129     #define LFDS610_BARRIER_PROCESSOR_FULL   __sync_synchronize()
130   #endif
131
132   #if (defined __unix__ && defined __arm__ && __GNUC__)
133     // TRD : any UNIX with GCC on ARM
134     #include <assert.h>
135     #include <stdio.h>
136     #include <stdlib.h>
137     typedef unsigned long int                lfds610_atom_t;
138     #define LFDS610_INLINE                   inline
139     #define LFDS610_ALIGN(alignment)         __attribute__( (aligned(alignment)) )
140     #define LFDS610_ALIGN_SINGLE_POINTER     4
141     #define LFDS610_ALIGN_DOUBLE_POINTER     8
142     #define LFDS610_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )
143     #define LFDS610_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )
144     #define LFDS610_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )
145     #define LFDS610_BARRIER_PROCESSOR_LOAD   __sync_synchronize()
146     #define LFDS610_BARRIER_PROCESSOR_STORE  __sync_synchronize()
147     #define LFDS610_BARRIER_PROCESSOR_FULL   __sync_synchronize()
148   #endif
149
150   #define LFDS610_BARRIER_LOAD   LFDS610_BARRIER_COMPILER_LOAD; LFDS610_BARRIER_PROCESSOR_LOAD; LFDS610_BARRIER_COMPILER_LOAD
151   #define LFDS610_BARRIER_STORE  LFDS610_BARRIER_COMPILER_STORE; LFDS610_BARRIER_PROCESSOR_STORE; LFDS610_BARRIER_COMPILER_STORE
152   #define LFDS610_BARRIER_FULL   LFDS610_BARRIER_COMPILER_FULL; LFDS610_BARRIER_PROCESSOR_FULL; LFDS610_BARRIER_COMPILER_FULL
153
154   /***** enums *****/
155   enum lfds610_data_structure_validity
156   {
157     LFDS610_VALIDITY_VALID,
158     LFDS610_VALIDITY_INVALID_LOOP,
159     LFDS610_VALIDITY_INVALID_MISSING_ELEMENTS,
160     LFDS610_VALIDITY_INVALID_ADDITIONAL_ELEMENTS,
161     LFDS610_VALIDITY_INVALID_TEST_DATA
162   };
163
164   /***** structs *****/
165   struct lfds610_validation_info
166   {
167     lfds610_atom_t
168       min_elements,
169       max_elements;
170   };
171
172   /***** public prototypes *****/
173   void *lfds610_abstraction_malloc( size_t size );
174   void lfds610_abstraction_free( void *memory );
175
176
177
178
179
180   /***** lfds610_freelist *****/
181
182   /***** enums *****/
183   enum lfds610_freelist_query_type
184   {
185     LFDS610_FREELIST_QUERY_ELEMENT_COUNT,
186     LFDS610_FREELIST_QUERY_VALIDATE
187   };
188
189   /***** incomplete types *****/
190   struct lfds610_freelist_state;
191   struct lfds610_freelist_element;
192
193   /***** public prototypes *****/
194   int lfds610_freelist_new( struct lfds610_freelist_state **fs, lfds610_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );
195   void lfds610_freelist_use( struct lfds610_freelist_state *fs );
196   void lfds610_freelist_delete( struct lfds610_freelist_state *fs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
197
198   lfds610_atom_t lfds610_freelist_new_elements( struct lfds610_freelist_state *fs, lfds610_atom_t number_elements );
199
200   struct lfds610_freelist_element *lfds610_freelist_pop( struct lfds610_freelist_state *fs, struct lfds610_freelist_element **fe );
201   struct lfds610_freelist_element *lfds610_freelist_guaranteed_pop( struct lfds610_freelist_state *fs, struct lfds610_freelist_element **fe );
202   void lfds610_freelist_push( struct lfds610_freelist_state *fs, struct lfds610_freelist_element *fe );
203
204   void *lfds610_freelist_get_user_data_from_element( struct lfds610_freelist_element *fe, void **user_data );
205   void lfds610_freelist_set_user_data_in_element( struct lfds610_freelist_element *fe, void *user_data );
206
207   void lfds610_freelist_query( struct lfds610_freelist_state *fs, enum lfds610_freelist_query_type query_type, void *query_input, void *query_output );
208
209
210
211
212
213   /***** lfds610_liblfds *****/
214
215   /***** public prototypes *****/
216   void lfds610_liblfds_abstraction_test_helper_increment_non_atomic( lfds610_atom_t *shared_counter );
217   void lfds610_liblfds_abstraction_test_helper_increment_atomic( volatile lfds610_atom_t *shared_counter );
218   void lfds610_liblfds_abstraction_test_helper_cas( volatile lfds610_atom_t *shared_counter, lfds610_atom_t *local_counter );
219   void lfds610_liblfds_abstraction_test_helper_dcas( volatile lfds610_atom_t *shared_counter, lfds610_atom_t *local_counter );
220
221
222
223
224
225   /***** lfds610_queue *****/
226
227   /***** enums *****/
228   enum lfds610_queue_query_type
229   {
230     LFDS610_QUEUE_QUERY_ELEMENT_COUNT,
231     LFDS610_QUEUE_QUERY_VALIDATE
232   };
233
234   /***** incomplete types *****/
235   struct lfds610_queue_state;
236
237   /***** public prototypes *****/
238   int lfds610_queue_new( struct lfds610_queue_state **sq, lfds610_atom_t number_elements );
239   void lfds610_queue_use( struct lfds610_queue_state *qs );
240   void lfds610_queue_delete( struct lfds610_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
241
242   int lfds610_queue_enqueue( struct lfds610_queue_state *qs, void *user_data );
243   int lfds610_queue_guaranteed_enqueue( struct lfds610_queue_state *qs, void *user_data );
244   int lfds610_queue_dequeue( struct lfds610_queue_state *qs, void **user_data );
245
246   void lfds610_queue_query( struct lfds610_queue_state *qs, enum lfds610_queue_query_type query_type, void *query_input, void *query_output );
247
248
249
250
251
252   /***** lfds610_ringbuffer *****/
253
254   /***** enums *****/
255   enum lfds610_ringbuffer_query_type
256   {
257     LFDS610_RINGBUFFER_QUERY_VALIDATE
258   };
259
260   /***** incomplete types *****/
261   struct lfds610_ringbuffer_state;
262
263   /***** public prototypes *****/
264   int lfds610_ringbuffer_new( struct lfds610_ringbuffer_state **rs, lfds610_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );
265   void lfds610_ringbuffer_use( struct lfds610_ringbuffer_state *rs );
266   void lfds610_ringbuffer_delete( struct lfds610_ringbuffer_state *rs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
267
268   struct lfds610_freelist_element *lfds610_ringbuffer_get_read_element( struct lfds610_ringbuffer_state *rs, struct lfds610_freelist_element **fe );
269   struct lfds610_freelist_element *lfds610_ringbuffer_get_write_element( struct lfds610_ringbuffer_state *rs, struct lfds610_freelist_element **fe, int *overwrite_flag );
270
271   void lfds610_ringbuffer_put_read_element( struct lfds610_ringbuffer_state *rs, struct lfds610_freelist_element *fe );
272   void lfds610_ringbuffer_put_write_element( struct lfds610_ringbuffer_state *rs, struct lfds610_freelist_element *fe );
273
274   void lfds610_ringbuffer_query( struct lfds610_ringbuffer_state *rs, enum lfds610_ringbuffer_query_type query_type, void *query_input, void *query_output );
275
276
277
278
279
280   /***** lfds610_slist *****/
281
282   /***** incomplete types *****/
283   struct lfds610_slist_state;
284   struct lfds610_slist_element;
285
286   /***** public prototypes *****/
287   int lfds610_slist_new( struct lfds610_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
288   void lfds610_slist_use( struct lfds610_slist_state *ss );
289   void lfds610_slist_delete( struct lfds610_slist_state *ss );
290
291   struct lfds610_slist_element *lfds610_slist_new_head( struct lfds610_slist_state *ss, void *user_data );
292   struct lfds610_slist_element *lfds610_slist_new_next( struct lfds610_slist_element *se, void *user_data );
293
294   int lfds610_slist_logically_delete_element( struct lfds610_slist_state *ss, struct lfds610_slist_element *se );
295   void lfds610_slist_single_threaded_physically_delete_all_elements( struct lfds610_slist_state *ss );
296
297   int lfds610_slist_get_user_data_from_element( struct lfds610_slist_element *se, void **user_data );
298   int lfds610_slist_set_user_data_in_element( struct lfds610_slist_element *se, void *user_data );
299
300   struct lfds610_slist_element *lfds610_slist_get_head( struct lfds610_slist_state *ss, struct lfds610_slist_element **se );
301   struct lfds610_slist_element *lfds610_slist_get_next( struct lfds610_slist_element *se, struct lfds610_slist_element **next_se );
302   struct lfds610_slist_element *lfds610_slist_get_head_and_then_next( struct lfds610_slist_state *ss, struct lfds610_slist_element **se );
303
304
305
306
307
308   /***** lfds610_stack *****/
309
310   /***** enums *****/
311   enum lfds610_stack_query_type
312   {
313     LFDS610_STACK_QUERY_ELEMENT_COUNT,
314     LFDS610_STACK_QUERY_VALIDATE
315   };
316
317   /***** incomplete types *****/
318   struct lfds610_stack_state;
319
320   /***** public prototypes *****/
321   int lfds610_stack_new( struct lfds610_stack_state **ss, lfds610_atom_t number_elements );
322   void lfds610_stack_use( struct lfds610_stack_state *ss );
323   void lfds610_stack_delete( struct lfds610_stack_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
324
325   void lfds610_stack_clear( struct lfds610_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state );
326
327   int lfds610_stack_push( struct lfds610_stack_state *ss, void *user_data );
328   int lfds610_stack_guaranteed_push( struct lfds610_stack_state *ss, void *user_data );
329   int lfds610_stack_pop( struct lfds610_stack_state *ss, void **user_data );
330
331   void lfds610_stack_query( struct lfds610_stack_state *ss, enum lfds610_stack_query_type query_type, void *query_input, void *query_output );
332
333
334
335
336
337   #define __LIBLFDS610_H
338
339 #endif
340