]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_link.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_slist / lfds611_slist_link.c
1 #include "lfds611_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void lfds611_slist_internal_link_element_to_head( struct lfds611_slist_state *ss, struct lfds611_slist_element *volatile se )\r
9 {\r
10   LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element\r
11     *se_next;\r
12 \r
13   assert( ss != NULL );\r
14   assert( se != NULL );\r
15 \r
16   LFDS611_BARRIER_LOAD;\r
17 \r
18   se_next = ss->head;\r
19 \r
20   do\r
21   {\r
22     se->next = se_next;\r
23   }\r
24   while( se->next != (se_next = (struct lfds611_slist_element *) lfds611_abstraction_cas((volatile lfds611_atom_t *) &ss->head, (lfds611_atom_t) se, (lfds611_atom_t) se->next)) );\r
25 \r
26   return;\r
27 }\r
28 \r
29 \r
30 \r
31 \r
32 \r
33 /****************************************************************************/\r
34 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
35 {\r
36   LFDS611_ALIGN(LFDS611_ALIGN_SINGLE_POINTER) struct lfds611_slist_element\r
37     *se_prev,\r
38     *se_next;\r
39 \r
40   assert( lfds611_slist_in_list_element != NULL );\r
41   assert( se != NULL );\r
42 \r
43   LFDS611_BARRIER_LOAD;\r
44 \r
45   se_prev = (struct lfds611_slist_element *) lfds611_slist_in_list_element;\r
46 \r
47   se_next = se_prev->next;\r
48 \r
49   do\r
50   {\r
51     se->next = se_next;\r
52   }\r
53   while( se->next != (se_next = (struct lfds611_slist_element *) lfds611_abstraction_cas((volatile lfds611_atom_t *) &se_prev->next, (lfds611_atom_t) se, (lfds611_atom_t) se->next)) );\r
54 \r
55   return;\r
56 }\r
57 \r