]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_slist/lfds601_slist_internal.h
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_slist / lfds601_slist_internal.h
1 /***** the library wide include file *****/\r
2 #include "lfds601_internal.h"\r
3 \r
4 /***** defines *****/\r
5 #define LFDS601_SLIST_USER_DATA  0\r
6 #define LFDS601_SLIST_FLAGS      1\r
7 \r
8 #define LFDS601_SLIST_NO_FLAGS      0x0\r
9 #define LFDS601_SLIST_FLAG_DELETED  0x1\r
10 \r
11 /***** structures *****/\r
12 #pragma pack( push, LFDS601_ALIGN_SINGLE_POINTER )\r
13 \r
14 struct lfds601_slist_state\r
15 {\r
16   struct lfds601_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, LFDS601_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 lfds601_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 lfds601_slist_element\r
43     *volatile next;\r
44 };\r
45 \r
46 #pragma pack( pop )\r
47 \r
48 /***** private prototypes *****/\r
49 void lfds601_slist_internal_init_slist( struct lfds601_slist_state *ss, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state );\r
50 \r
51 void lfds601_slist_internal_link_element_to_head( struct lfds601_slist_state *lfds601_slist_state, struct lfds601_slist_element *volatile se );\r
52 void lfds601_slist_internal_link_element_after_element( struct lfds601_slist_element *volatile lfds601_slist_in_list_element, struct lfds601_slist_element *volatile se );\r
53 \r
54 void lfds601_slist_internal_move_to_first_undeleted_element( struct lfds601_slist_element **se );\r
55 \r