]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/src/lfds610_slist/lfds610_slist_link.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / src / lfds610_slist / lfds610_slist_link.c
1 #include "lfds610_slist_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 void lfds610_slist_internal_link_element_to_head( struct lfds610_slist_state *ss, struct lfds610_slist_element *volatile se )
9 {
10   LFDS610_ALIGN(LFDS610_ALIGN_SINGLE_POINTER) struct lfds610_slist_element
11     *se_next;
12
13   assert( ss != NULL );
14   assert( se != NULL );
15
16   LFDS610_BARRIER_LOAD;
17
18   se_next = ss->head;
19
20   do
21   {
22     se->next = se_next;
23   }
24   while( se->next != (se_next = (struct lfds610_slist_element *) lfds610_abstraction_cas((volatile lfds610_atom_t *) &ss->head, (lfds610_atom_t) se, (lfds610_atom_t) se->next)) );
25
26   return;
27 }
28
29
30
31
32
33 /****************************************************************************/
34 void lfds610_slist_internal_link_element_after_element( struct lfds610_slist_element *volatile lfds610_slist_in_list_element, struct lfds610_slist_element *volatile se )
35 {
36   LFDS610_ALIGN(LFDS610_ALIGN_SINGLE_POINTER) struct lfds610_slist_element
37     *se_prev,
38     *se_next;
39
40   assert( lfds610_slist_in_list_element != NULL );
41   assert( se != NULL );
42
43   LFDS610_BARRIER_LOAD;
44
45   se_prev = (struct lfds610_slist_element *) lfds610_slist_in_list_element;
46
47   se_next = se_prev->next;
48
49   do
50   {
51     se->next = se_next;
52   }
53   while( se->next != (se_next = (struct lfds610_slist_element *) lfds610_abstraction_cas((volatile lfds610_atom_t *) &se_prev->next, (lfds610_atom_t) se, (lfds610_atom_t) se->next)) );
54
55   return;
56 }
57