1 /***** the library wide include file *****/
\r
2 #include "liblfds611_internal.h"
\r
4 /***** defines *****/
\r
5 #define LFDS611_SLIST_USER_DATA 0
\r
6 #define LFDS611_SLIST_FLAGS 1
\r
8 #define LFDS611_SLIST_NO_FLAGS 0x0
\r
9 #define LFDS611_SLIST_FLAG_DELETED 0x1
\r
11 /***** structures *****/
\r
12 #pragma pack( push, LFDS611_ALIGN_SINGLE_POINTER )
\r
14 struct lfds611_slist_state
\r
16 struct lfds611_slist_element
\r
20 (*user_data_delete_function)( void *user_data, void *user_state ),
\r
26 #pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER )
\r
28 /* TRD : this pragma pack doesn't seem to work under Windows
\r
29 if the structure members are the correct way round
\r
30 (next first), then user_data_and_flags ends up on
\r
31 a single pointer boundary and DCAS crashes
\r
33 accordingly, I've moved user_data_and_flags first
\r
36 struct lfds611_slist_element
\r
39 *volatile user_data_and_flags[2];
\r
41 // TRD : requires volatile as is target of CAS
\r
42 struct lfds611_slist_element
\r
48 /***** private prototypes *****/
\r
49 void lfds611_slist_internal_init_slist( struct lfds611_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );
\r
51 void lfds611_slist_internal_link_element_to_head( struct lfds611_slist_state *lfds611_slist_state, struct lfds611_slist_element *volatile se );
\r
52 void lfds611_slist_internal_link_element_after_element( struct lfds611_slist_element *volatile lfds611_slist_in_list_element, struct lfds611_slist_element *volatile se );
\r
54 void lfds611_slist_internal_move_to_first_undeleted_element( struct lfds611_slist_element **se );
\r