]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_slist/lfds601_slist_link.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_slist / lfds601_slist_link.c
1 #include "lfds601_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void lfds601_slist_internal_link_element_to_head( struct lfds601_slist_state *ss, struct lfds601_slist_element *volatile se )\r
9 {\r
10   LFDS601_ALIGN(LFDS601_ALIGN_SINGLE_POINTER) struct lfds601_slist_element\r
11     *se_next;\r
12 \r
13   assert( ss != NULL );\r
14   assert( se != NULL );\r
15 \r
16   se_next = ss->head;\r
17 \r
18   do\r
19   {\r
20     se->next = se_next;\r
21   }\r
22   while( se->next != (se_next = (struct lfds601_slist_element *) lfds601_abstraction_cas((volatile lfds601_atom_t *) &ss->head, (lfds601_atom_t) se, (lfds601_atom_t) se->next)) );\r
23 \r
24   return;\r
25 }\r
26 \r
27 \r
28 \r
29 \r
30 \r
31 /****************************************************************************/\r
32 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
33 {\r
34   LFDS601_ALIGN(LFDS601_ALIGN_SINGLE_POINTER) struct lfds601_slist_element\r
35     *se_prev,\r
36     *se_next;\r
37 \r
38   assert( lfds601_slist_in_list_element != NULL );\r
39   assert( se != NULL );\r
40 \r
41   se_prev = (struct lfds601_slist_element *) lfds601_slist_in_list_element;\r
42 \r
43   se_next = se_prev->next;\r
44 \r
45   do\r
46   {\r
47     se->next = se_next;\r
48   }\r
49   while( se->next != (se_next = (struct lfds601_slist_element *) lfds601_abstraction_cas((volatile lfds601_atom_t *) &se_prev->next, (lfds601_atom_t) se, (lfds601_atom_t) se->next)) );\r
50 \r
51   return;\r
52 }\r
53 \r