3 /***** library header *****/
4 #define LFDS601_RELEASE_NUMBER_STRING "6.0.1"
9 /***** lfds601_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 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
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
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
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)
43 #if (defined _WIN64 && defined _MSC_VER && defined WIN_KERNEL_BUILD)
44 // TRD : 64-bit Windows kernel with the Microsoft C compiler, any CPU
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
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
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
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)
72 #if (defined __unix__ && defined __x86_64__ && __GNUC__)
73 // TRD : any UNIX with GCC on x64
74 #define _XOPEN_SOURCE 600
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
85 #if (defined __unix__ && defined __i686__ && __GNUC__)
86 // TRD : any UNIX with GCC on x86
87 #define _XOPEN_SOURCE 600
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
98 #if (defined __unix__ && defined __arm__ && __GNUC__)
99 // TRD : any UNIX with GCC on ARM
100 #define _XOPEN_SOURCE 600
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
112 enum lfds601_data_structure_validity
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
121 /***** structs *****/
122 struct lfds601_validation_info
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 );
140 /***** lfds601_freelist *****/
143 enum lfds601_freelist_query_type
145 LFDS601_FREELIST_QUERY_ELEMENT_COUNT,
146 LFDS601_FREELIST_QUERY_VALIDATE
149 /***** incomplete types *****/
150 struct lfds601_freelist_state;
151 struct lfds601_freelist_element;
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 );
157 lfds601_atom_t lfds601_freelist_new_elements( struct lfds601_freelist_state *fs, lfds601_atom_t number_elements );
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 );
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 );
166 void lfds601_freelist_query( struct lfds601_freelist_state *fs, enum lfds601_freelist_query_type query_type, void *query_input, void *query_output );
172 /***** lfds601_queue *****/
175 enum lfds601_queue_query_type
177 LFDS601_QUEUE_QUERY_ELEMENT_COUNT,
178 LFDS601_QUEUE_QUERY_VALIDATE
181 /***** incomplete types *****/
182 struct lfds601_queue_state;
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 );
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 );
192 void lfds601_queue_query( struct lfds601_queue_state *qs, enum lfds601_queue_query_type query_type, void *query_input, void *query_output );
198 /***** lfds601_ringbuffer *****/
201 enum lfds601_ringbuffer_query_type
203 LFDS601_RINGBUFFER_QUERY_VALIDATE
206 /***** incomplete types *****/
207 struct lfds601_ringbuffer_state;
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 );
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 );
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 );
219 void lfds601_ringbuffer_query( struct lfds601_ringbuffer_state *rs, enum lfds601_ringbuffer_query_type query_type, void *query_input, void *query_output );
225 /***** lfds601_slist *****/
227 /***** incomplete types *****/
228 struct lfds601_slist_state;
229 struct lfds601_slist_element;
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 );
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 );
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 );
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 );
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 );
252 /***** lfds601_stack *****/
255 enum lfds601_stack_query_type
257 LFDS601_STACK_QUERY_ELEMENT_COUNT
260 /***** incomplete types *****/
261 struct lfds601_stack_state;
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 );
267 void lfds601_stack_clear( struct lfds601_stack_state *ss, void (*user_data_clear_function)(void *user_data, void *user_state), void *user_state );
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 );
273 void lfds601_stack_query( struct lfds601_stack_state *ss, enum lfds601_stack_query_type query_type, void *query_input, void *query_output );
279 #define __LIBLFDS601_H