]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_internal.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_slist / lfds611_slist_internal.h
1 /***** the library wide include file *****/\r
2 #include "liblfds611_internal.h"\r
3 \r
4 /***** defines *****/\r
5 #define LFDS611_SLIST_USER_DATA  0\r
6 #define LFDS611_SLIST_FLAGS      1\r
7 \r
8 #define LFDS611_SLIST_NO_FLAGS      0x0\r
9 #define LFDS611_SLIST_FLAG_DELETED  0x1\r
10 \r
11 /***** structures *****/\r
12 #pragma pack( push, LFDS611_ALIGN_SINGLE_POINTER )\r
13 \r
14 struct lfds611_slist_state\r
15 {\r
16   struct lfds611_slist_element\r
17     *volatile head;\r
18 \r
19   void\r
20     (*user_data_delete_function)( void *user_data, void *user_state ),\r
21     *user_state;\r
22 };\r
23 \r
24 #pragma pack( pop )\r
25 \r
26 #pragma pack( push, LFDS611_ALIGN_DOUBLE_POINTER )\r
27 \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
32 \r
33          accordingly, I've moved user_data_and_flags first\r
34 */\r
35 \r
36 struct lfds611_slist_element\r
37 {\r
38   void\r
39     *volatile user_data_and_flags[2];\r
40 \r
41   // TRD : requires volatile as is target of CAS\r
42   struct lfds611_slist_element\r
43     *volatile next;\r
44 };\r
45 \r
46 #pragma pack( pop )\r
47 \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
50 \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
53 \r
54 void lfds611_slist_internal_move_to_first_undeleted_element( struct lfds611_slist_element **se );\r
55 \r