3 /***** library header *****/
4 #define LFDS610_RELEASE_NUMBER_STRING "6.1.0"
9 /***** lfds610_abstraction *****/
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
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()
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
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()
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)
55 #if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
56 // TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU
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()
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
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()
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)
96 #if (defined __unix__ && defined __x86_64__ && __GNUC__)
97 // TRD : any UNIX with GCC on x64
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()
114 #if (defined __unix__ && defined __i686__ && __GNUC__)
115 // TRD : any UNIX with GCC on x86
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()
132 #if (defined __unix__ && defined __arm__ && __GNUC__)
133 // TRD : any UNIX with GCC on ARM
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()
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
155 enum lfds610_data_structure_validity
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
164 /***** structs *****/
165 struct lfds610_validation_info
172 /***** public prototypes *****/
173 void *lfds610_abstraction_malloc( size_t size );
174 void lfds610_abstraction_free( void *memory );
180 /***** lfds610_freelist *****/
183 enum lfds610_freelist_query_type
185 LFDS610_FREELIST_QUERY_ELEMENT_COUNT,
186 LFDS610_FREELIST_QUERY_VALIDATE
189 /***** incomplete types *****/
190 struct lfds610_freelist_state;
191 struct lfds610_freelist_element;
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 );
198 lfds610_atom_t lfds610_freelist_new_elements( struct lfds610_freelist_state *fs, lfds610_atom_t number_elements );
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 );
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 );
207 void lfds610_freelist_query( struct lfds610_freelist_state *fs, enum lfds610_freelist_query_type query_type, void *query_input, void *query_output );
213 /***** lfds610_liblfds *****/
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 );
225 /***** lfds610_queue *****/
228 enum lfds610_queue_query_type
230 LFDS610_QUEUE_QUERY_ELEMENT_COUNT,
231 LFDS610_QUEUE_QUERY_VALIDATE
234 /***** incomplete types *****/
235 struct lfds610_queue_state;
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 );
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 );
246 void lfds610_queue_query( struct lfds610_queue_state *qs, enum lfds610_queue_query_type query_type, void *query_input, void *query_output );
252 /***** lfds610_ringbuffer *****/
255 enum lfds610_ringbuffer_query_type
257 LFDS610_RINGBUFFER_QUERY_VALIDATE
260 /***** incomplete types *****/
261 struct lfds610_ringbuffer_state;
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 );
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 );
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 );
274 void lfds610_ringbuffer_query( struct lfds610_ringbuffer_state *rs, enum lfds610_ringbuffer_query_type query_type, void *query_input, void *query_output );
280 /***** lfds610_slist *****/
282 /***** incomplete types *****/
283 struct lfds610_slist_state;
284 struct lfds610_slist_element;
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 );
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 );
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 );
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 );
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 );
308 /***** lfds610_stack *****/
311 enum lfds610_stack_query_type
313 LFDS610_STACK_QUERY_ELEMENT_COUNT,
314 LFDS610_STACK_QUERY_VALIDATE
317 /***** incomplete types *****/
318 struct lfds610_stack_state;
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 );
325 void lfds610_stack_clear( struct lfds610_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state );
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 );
331 void lfds610_stack_query( struct lfds610_stack_state *ss, enum lfds610_stack_query_type query_type, void *query_input, void *query_output );
337 #define __LIBLFDS610_H