]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/inc/liblfds611.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / inc / liblfds611.h
1 #ifndef __LIBLFDS611_H\r
2 \r
3   /***** library header *****/\r
4   #define LFDS611_RELEASE_NUMBER_STRING  "6.1.1"\r
5 \r
6 \r
7 \r
8 \r
9   /***** lfds611_abstraction *****/\r
10 \r
11   /***** defines *****/\r
12   #if (defined _WIN64 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)\r
13     // TRD : 64-bit Windows user-mode with the Microsoft C compiler, any CPU\r
14     #include <assert.h>\r
15     #include <stdio.h>\r
16     #include <stdlib.h>\r
17     #include <windows.h>\r
18     #include <intrin.h>\r
19     typedef unsigned __int64                 lfds611_atom_t;\r
20     #define LFDS611_INLINE                   __forceinline\r
21     #define LFDS611_ALIGN(alignment)         __declspec( align(alignment) )\r
22     #define LFDS611_ALIGN_SINGLE_POINTER     8\r
23     #define LFDS611_ALIGN_DOUBLE_POINTER     16\r
24     #define LFDS611_BARRIER_COMPILER_LOAD    _ReadBarrier()\r
25     #define LFDS611_BARRIER_COMPILER_STORE   _WriteBarrier()\r
26     #define LFDS611_BARRIER_COMPILER_FULL    _ReadWriteBarrier()\r
27     #define LFDS611_BARRIER_PROCESSOR_LOAD   _mm_lfence()\r
28     #define LFDS611_BARRIER_PROCESSOR_STORE  _mm_sfence()\r
29     #define LFDS611_BARRIER_PROCESSOR_FULL   _mm_mfence()\r
30   #endif\r
31 \r
32   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && !defined WIN_KERNEL_BUILD)\r
33     // TRD : 32-bit Windows user-mode with the Microsoft C compiler, any CPU\r
34     #include <assert.h>\r
35     #include <stdio.h>\r
36     #include <stdlib.h>\r
37     #include <windows.h>\r
38     #include <intrin.h>\r
39     typedef unsigned long int                lfds611_atom_t;\r
40     #define LFDS611_INLINE                   __forceinline\r
41     #define LFDS611_ALIGN(alignment)         __declspec( align(alignment) )\r
42     #define LFDS611_ALIGN_SINGLE_POINTER     4\r
43     #define LFDS611_ALIGN_DOUBLE_POINTER     8\r
44     #define LFDS611_BARRIER_COMPILER_LOAD    _ReadBarrier()\r
45     #define LFDS611_BARRIER_COMPILER_STORE   _WriteBarrier()\r
46     #define LFDS611_BARRIER_COMPILER_FULL    _ReadWriteBarrier()\r
47     #define LFDS611_BARRIER_PROCESSOR_LOAD   _mm_lfence()\r
48     #define LFDS611_BARRIER_PROCESSOR_STORE  _mm_sfence()\r
49     #define LFDS611_BARRIER_PROCESSOR_FULL   _mm_mfence()\r
50 \r
51     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0\r
52     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)\r
53   #endif\r
54 \r
55   #if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD)\r
56     // TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU\r
57     #include <assert.h>\r
58     #include <stdio.h>\r
59     #include <stdlib.h>\r
60     #include <wdm.h>\r
61     typedef unsigned __int64                 lfds611_atom_t;\r
62     #define LFDS611_INLINE                   __forceinline\r
63     #define LFDS611_ALIGN(alignment)         __declspec( align(alignment) )\r
64     #define LFDS611_ALIGN_SINGLE_POINTER     8\r
65     #define LFDS611_ALIGN_DOUBLE_POINTER     16\r
66     #define LFDS611_BARRIER_COMPILER_LOAD    _ReadBarrier()\r
67     #define LFDS611_BARRIER_COMPILER_STORE   _WriteBarrier()\r
68     #define LFDS611_BARRIER_COMPILER_FULL    _ReadWriteBarrier()\r
69     #define LFDS611_BARRIER_PROCESSOR_LOAD   _mm_lfence()\r
70     #define LFDS611_BARRIER_PROCESSOR_STORE  _mm_sfence()\r
71     #define LFDS611_BARRIER_PROCESSOR_FULL   _mm_mfence()\r
72   #endif\r
73 \r
74   #if (!defined _WIN64 && defined _WIN32 && defined _MSC_VER && defined WIN_KERNEL_BUILD)\r
75     // TRD : 32-bit Windows kernel with the Microsoft C compiler, any CPU\r
76     #include <assert.h>\r
77     #include <stdio.h>\r
78     #include <stdlib.h>\r
79     #include <wdm.h>\r
80     typedef unsigned long int                lfds611_atom_t;\r
81     #define LFDS611_INLINE                   __forceinline\r
82     #define LFDS611_ALIGN(alignment)         __declspec( align(alignment) )\r
83     #define LFDS611_ALIGN_SINGLE_POINTER     4\r
84     #define LFDS611_ALIGN_DOUBLE_POINTER     8\r
85     #define LFDS611_BARRIER_COMPILER_LOAD    _ReadBarrier()\r
86     #define LFDS611_BARRIER_COMPILER_STORE   _WriteBarrier()\r
87     #define LFDS611_BARRIER_COMPILER_FULL    _ReadWriteBarrier()\r
88     #define LFDS611_BARRIER_PROCESSOR_LOAD   _mm_lfence()\r
89     #define LFDS611_BARRIER_PROCESSOR_STORE  _mm_sfence()\r
90     #define LFDS611_BARRIER_PROCESSOR_FULL   _mm_mfence()\r
91 \r
92     // TRD : this define is documented but missing in Microsoft Platform SDK v7.0\r
93     #define _InterlockedCompareExchangePointer(destination, exchange, compare) _InterlockedCompareExchange((volatile long *) destination, (long) exchange, (long) compare)\r
94   #endif\r
95 \r
96   #if (defined __unix__ && defined __x86_64__ && __GNUC__)\r
97     // TRD : any UNIX with GCC on x64\r
98     #include <assert.h>\r
99     #include <stdio.h>\r
100     #include <stdlib.h>\r
101     typedef unsigned long long int           lfds611_atom_t;\r
102     #define LFDS611_INLINE                   inline\r
103     #define LFDS611_ALIGN(alignment)         __attribute__( (aligned(alignment)) )\r
104     #define LFDS611_ALIGN_SINGLE_POINTER     8\r
105     #define LFDS611_ALIGN_DOUBLE_POINTER     16\r
106     #define LFDS611_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )\r
107     #define LFDS611_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )\r
108     #define LFDS611_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )\r
109     #define LFDS611_BARRIER_PROCESSOR_LOAD   __sync_synchronize()\r
110     #define LFDS611_BARRIER_PROCESSOR_STORE  __sync_synchronize()\r
111     #define LFDS611_BARRIER_PROCESSOR_FULL   __sync_synchronize()\r
112   #endif\r
113 \r
114   #if (defined __unix__ && defined __i686__ && __GNUC__)\r
115     // TRD : any UNIX with GCC on x86\r
116     #include <assert.h>\r
117     #include <stdio.h>\r
118     #include <stdlib.h>\r
119     typedef unsigned long int                lfds611_atom_t;\r
120     #define LFDS611_INLINE                   inline\r
121     #define LFDS611_ALIGN(alignment)         __attribute__( (aligned(alignment)) )\r
122     #define LFDS611_ALIGN_SINGLE_POINTER     4\r
123     #define LFDS611_ALIGN_DOUBLE_POINTER     8\r
124     #define LFDS611_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )\r
125     #define LFDS611_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )\r
126     #define LFDS611_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )\r
127     #define LFDS611_BARRIER_PROCESSOR_LOAD   __sync_synchronize()\r
128     #define LFDS611_BARRIER_PROCESSOR_STORE  __sync_synchronize()\r
129     #define LFDS611_BARRIER_PROCESSOR_FULL   __sync_synchronize()\r
130   #endif\r
131 \r
132   #if (defined __unix__ && defined __arm__ && __GNUC__)\r
133     // TRD : any UNIX with GCC on ARM\r
134     #include <assert.h>\r
135     #include <stdio.h>\r
136     #include <stdlib.h>\r
137     typedef unsigned long int                lfds611_atom_t;\r
138     #define LFDS611_INLINE                   inline\r
139     #define LFDS611_ALIGN(alignment)         __attribute__( (aligned(alignment)) )\r
140     #define LFDS611_ALIGN_SINGLE_POINTER     4\r
141     #define LFDS611_ALIGN_DOUBLE_POINTER     8\r
142     #define LFDS611_BARRIER_COMPILER_LOAD    __asm__ __volatile__ ( "" : : : "memory" )\r
143     #define LFDS611_BARRIER_COMPILER_STORE   __asm__ __volatile__ ( "" : : : "memory" )\r
144     #define LFDS611_BARRIER_COMPILER_FULL    __asm__ __volatile__ ( "" : : : "memory" )\r
145     #define LFDS611_BARRIER_PROCESSOR_LOAD   __sync_synchronize()\r
146     #define LFDS611_BARRIER_PROCESSOR_STORE  __sync_synchronize()\r
147     #define LFDS611_BARRIER_PROCESSOR_FULL   __sync_synchronize()\r
148   #endif\r
149 \r
150   #define LFDS611_BARRIER_LOAD   LFDS611_BARRIER_COMPILER_LOAD; LFDS611_BARRIER_PROCESSOR_LOAD; LFDS611_BARRIER_COMPILER_LOAD\r
151   #define LFDS611_BARRIER_STORE  LFDS611_BARRIER_COMPILER_STORE; LFDS611_BARRIER_PROCESSOR_STORE; LFDS611_BARRIER_COMPILER_STORE\r
152   #define LFDS611_BARRIER_FULL   LFDS611_BARRIER_COMPILER_FULL; LFDS611_BARRIER_PROCESSOR_FULL; LFDS611_BARRIER_COMPILER_FULL\r
153 \r
154   /***** enums *****/\r
155   enum lfds611_data_structure_validity\r
156   {\r
157     LFDS611_VALIDITY_VALID,\r
158     LFDS611_VALIDITY_INVALID_LOOP,\r
159     LFDS611_VALIDITY_INVALID_MISSING_ELEMENTS,\r
160     LFDS611_VALIDITY_INVALID_ADDITIONAL_ELEMENTS,\r
161     LFDS611_VALIDITY_INVALID_TEST_DATA\r
162   };\r
163 \r
164   /***** structs *****/\r
165   struct lfds611_validation_info\r
166   {\r
167     lfds611_atom_t\r
168       min_elements,\r
169       max_elements;\r
170   };\r
171 \r
172   /***** public prototypes *****/\r
173   void *lfds611_abstraction_malloc( size_t size );\r
174   void lfds611_abstraction_free( void *memory );\r
175 \r
176 \r
177 \r
178 \r
179 \r
180   /***** lfds611_freelist *****/\r
181 \r
182   /***** enums *****/\r
183   enum lfds611_freelist_query_type\r
184   {\r
185     LFDS611_FREELIST_QUERY_ELEMENT_COUNT,\r
186     LFDS611_FREELIST_QUERY_VALIDATE\r
187   };\r
188 \r
189   /***** incomplete types *****/\r
190   struct lfds611_freelist_state;\r
191   struct lfds611_freelist_element;\r
192 \r
193   /***** public prototypes *****/\r
194   int lfds611_freelist_new( struct lfds611_freelist_state **fs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );\r
195   void lfds611_freelist_use( struct lfds611_freelist_state *fs );\r
196   void lfds611_freelist_delete( struct lfds611_freelist_state *fs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
197 \r
198   lfds611_atom_t lfds611_freelist_new_elements( struct lfds611_freelist_state *fs, lfds611_atom_t number_elements );\r
199 \r
200   struct lfds611_freelist_element *lfds611_freelist_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe );\r
201   struct lfds611_freelist_element *lfds611_freelist_guaranteed_pop( struct lfds611_freelist_state *fs, struct lfds611_freelist_element **fe );\r
202   void lfds611_freelist_push( struct lfds611_freelist_state *fs, struct lfds611_freelist_element *fe );\r
203 \r
204   void *lfds611_freelist_get_user_data_from_element( struct lfds611_freelist_element *fe, void **user_data );\r
205   void lfds611_freelist_set_user_data_in_element( struct lfds611_freelist_element *fe, void *user_data );\r
206 \r
207   void lfds611_freelist_query( struct lfds611_freelist_state *fs, enum lfds611_freelist_query_type query_type, void *query_input, void *query_output );\r
208 \r
209 \r
210 \r
211 \r
212 \r
213   /***** lfds611_liblfds *****/\r
214 \r
215   /***** public prototypes *****/\r
216   void lfds611_liblfds_abstraction_test_helper_increment_non_atomic( lfds611_atom_t *shared_counter );\r
217   void lfds611_liblfds_abstraction_test_helper_increment_atomic( volatile lfds611_atom_t *shared_counter );\r
218   void lfds611_liblfds_abstraction_test_helper_cas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter );\r
219   void lfds611_liblfds_abstraction_test_helper_dcas( volatile lfds611_atom_t *shared_counter, lfds611_atom_t *local_counter );\r
220 \r
221 \r
222 \r
223 \r
224 \r
225   /***** lfds611_queue *****/\r
226 \r
227   /***** enums *****/\r
228   enum lfds611_queue_query_type\r
229   {\r
230     LFDS611_QUEUE_QUERY_ELEMENT_COUNT,\r
231     LFDS611_QUEUE_QUERY_VALIDATE\r
232   };\r
233 \r
234   /***** incomplete types *****/\r
235   struct lfds611_queue_state;\r
236 \r
237   /***** public prototypes *****/\r
238   int lfds611_queue_new( struct lfds611_queue_state **sq, lfds611_atom_t number_elements );\r
239   void lfds611_queue_use( struct lfds611_queue_state *qs );\r
240   void lfds611_queue_delete( struct lfds611_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
241 \r
242   int lfds611_queue_enqueue( struct lfds611_queue_state *qs, void *user_data );\r
243   int lfds611_queue_guaranteed_enqueue( struct lfds611_queue_state *qs, void *user_data );\r
244   int lfds611_queue_dequeue( struct lfds611_queue_state *qs, void **user_data );\r
245 \r
246   void lfds611_queue_query( struct lfds611_queue_state *qs, enum lfds611_queue_query_type query_type, void *query_input, void *query_output );\r
247 \r
248 \r
249 \r
250 \r
251 \r
252   /***** lfds611_ringbuffer *****/\r
253 \r
254   /***** enums *****/\r
255   enum lfds611_ringbuffer_query_type\r
256   {\r
257     LFDS611_RINGBUFFER_QUERY_VALIDATE\r
258   };\r
259 \r
260   /***** incomplete types *****/\r
261   struct lfds611_ringbuffer_state;\r
262 \r
263   /***** public prototypes *****/\r
264   int lfds611_ringbuffer_new( struct lfds611_ringbuffer_state **rs, lfds611_atom_t number_elements, int (*user_data_init_function)(void **user_data, void *user_state), void *user_state );\r
265   void lfds611_ringbuffer_use( struct lfds611_ringbuffer_state *rs );\r
266   void lfds611_ringbuffer_delete( struct lfds611_ringbuffer_state *rs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
267 \r
268   struct lfds611_freelist_element *lfds611_ringbuffer_get_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe );\r
269   struct lfds611_freelist_element *lfds611_ringbuffer_get_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element **fe, int *overwrite_flag );\r
270 \r
271   void lfds611_ringbuffer_put_read_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe );\r
272   void lfds611_ringbuffer_put_write_element( struct lfds611_ringbuffer_state *rs, struct lfds611_freelist_element *fe );\r
273 \r
274   void lfds611_ringbuffer_query( struct lfds611_ringbuffer_state *rs, enum lfds611_ringbuffer_query_type query_type, void *query_input, void *query_output );\r
275 \r
276 \r
277 \r
278 \r
279 \r
280   /***** lfds611_slist *****/\r
281 \r
282   /***** incomplete types *****/\r
283   struct lfds611_slist_state;\r
284   struct lfds611_slist_element;\r
285 \r
286   /***** public prototypes *****/\r
287   int lfds611_slist_new( struct lfds611_slist_state **ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
288   void lfds611_slist_use( struct lfds611_slist_state *ss );\r
289   void lfds611_slist_delete( struct lfds611_slist_state *ss );\r
290 \r
291   struct lfds611_slist_element *lfds611_slist_new_head( struct lfds611_slist_state *ss, void *user_data );\r
292   struct lfds611_slist_element *lfds611_slist_new_next( struct lfds611_slist_element *se, void *user_data );\r
293 \r
294   int lfds611_slist_logically_delete_element( struct lfds611_slist_state *ss, struct lfds611_slist_element *se );\r
295   void lfds611_slist_single_threaded_physically_delete_all_elements( struct lfds611_slist_state *ss );\r
296 \r
297   int lfds611_slist_get_user_data_from_element( struct lfds611_slist_element *se, void **user_data );\r
298   int lfds611_slist_set_user_data_in_element( struct lfds611_slist_element *se, void *user_data );\r
299 \r
300   struct lfds611_slist_element *lfds611_slist_get_head( struct lfds611_slist_state *ss, struct lfds611_slist_element **se );\r
301   struct lfds611_slist_element *lfds611_slist_get_next( struct lfds611_slist_element *se, struct lfds611_slist_element **next_se );\r
302   struct lfds611_slist_element *lfds611_slist_get_head_and_then_next( struct lfds611_slist_state *ss, struct lfds611_slist_element **se );\r
303 \r
304 \r
305 \r
306 \r
307 \r
308   /***** lfds611_stack *****/\r
309 \r
310   /***** enums *****/\r
311   enum lfds611_stack_query_type\r
312   {\r
313     LFDS611_STACK_QUERY_ELEMENT_COUNT,\r
314     LFDS611_STACK_QUERY_VALIDATE\r
315   };\r
316 \r
317   /***** incomplete types *****/\r
318   struct lfds611_stack_state;\r
319 \r
320   /***** public prototypes *****/\r
321   int lfds611_stack_new( struct lfds611_stack_state **ss, lfds611_atom_t number_elements );\r
322   void lfds611_stack_use( struct lfds611_stack_state *ss );\r
323   void lfds611_stack_delete( struct lfds611_stack_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
324 \r
325   void lfds611_stack_clear( struct lfds611_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state );\r
326 \r
327   int lfds611_stack_push( struct lfds611_stack_state *ss, void *user_data );\r
328   int lfds611_stack_guaranteed_push( struct lfds611_stack_state *ss, void *user_data );\r
329   int lfds611_stack_pop( struct lfds611_stack_state *ss, void **user_data );\r
330 \r
331   void lfds611_stack_query( struct lfds611_stack_state *ss, enum lfds611_stack_query_type query_type, void *query_input, void *query_output );\r
332 \r
333 \r
334 \r
335 \r
336 \r
337   #define __LIBLFDS611_H\r
338 \r
339 #endif\r
340 \r