1 #ifndef __LIBLFDS611_H
\r
3 /***** library header *****/
\r
4 #define LFDS611_RELEASE_NUMBER_STRING "6.1.1"
\r
9 /***** lfds611_abstraction *****/
\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
17 #include <windows.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
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
37 #include <windows.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
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
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
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
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
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
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
96 #if (defined __unix__ && defined __x86_64__ && __GNUC__)
\r
97 // TRD : any UNIX with GCC on x64
\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
114 #if (defined __unix__ && defined __i686__ && __GNUC__)
\r
115 // TRD : any UNIX with GCC on x86
\r
116 #include <assert.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
132 #if (defined __unix__ && defined __arm__ && __GNUC__)
\r
133 // TRD : any UNIX with GCC on ARM
\r
134 #include <assert.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
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
154 /***** enums *****/
\r
155 enum lfds611_data_structure_validity
\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
164 /***** structs *****/
\r
165 struct lfds611_validation_info
\r
172 /***** public prototypes *****/
\r
173 void *lfds611_abstraction_malloc( size_t size );
\r
174 void lfds611_abstraction_free( void *memory );
\r
180 /***** lfds611_freelist *****/
\r
182 /***** enums *****/
\r
183 enum lfds611_freelist_query_type
\r
185 LFDS611_FREELIST_QUERY_ELEMENT_COUNT,
\r
186 LFDS611_FREELIST_QUERY_VALIDATE
\r
189 /***** incomplete types *****/
\r
190 struct lfds611_freelist_state;
\r
191 struct lfds611_freelist_element;
\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
198 lfds611_atom_t lfds611_freelist_new_elements( struct lfds611_freelist_state *fs, lfds611_atom_t number_elements );
\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
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
207 void lfds611_freelist_query( struct lfds611_freelist_state *fs, enum lfds611_freelist_query_type query_type, void *query_input, void *query_output );
\r
213 /***** lfds611_liblfds *****/
\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
225 /***** lfds611_queue *****/
\r
227 /***** enums *****/
\r
228 enum lfds611_queue_query_type
\r
230 LFDS611_QUEUE_QUERY_ELEMENT_COUNT,
\r
231 LFDS611_QUEUE_QUERY_VALIDATE
\r
234 /***** incomplete types *****/
\r
235 struct lfds611_queue_state;
\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
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
246 void lfds611_queue_query( struct lfds611_queue_state *qs, enum lfds611_queue_query_type query_type, void *query_input, void *query_output );
\r
252 /***** lfds611_ringbuffer *****/
\r
254 /***** enums *****/
\r
255 enum lfds611_ringbuffer_query_type
\r
257 LFDS611_RINGBUFFER_QUERY_VALIDATE
\r
260 /***** incomplete types *****/
\r
261 struct lfds611_ringbuffer_state;
\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
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
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
274 void lfds611_ringbuffer_query( struct lfds611_ringbuffer_state *rs, enum lfds611_ringbuffer_query_type query_type, void *query_input, void *query_output );
\r
280 /***** lfds611_slist *****/
\r
282 /***** incomplete types *****/
\r
283 struct lfds611_slist_state;
\r
284 struct lfds611_slist_element;
\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
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
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
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
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
308 /***** lfds611_stack *****/
\r
310 /***** enums *****/
\r
311 enum lfds611_stack_query_type
\r
313 LFDS611_STACK_QUERY_ELEMENT_COUNT,
\r
314 LFDS611_STACK_QUERY_VALIDATE
\r
317 /***** incomplete types *****/
\r
318 struct lfds611_stack_state;
\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
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
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
331 void lfds611_stack_query( struct lfds611_stack_state *ss, enum lfds611_stack_query_type query_type, void *query_input, void *query_output );
\r
337 #define __LIBLFDS611_H
\r