]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/src/lfds610_slist/lfds610_slist_delete.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / src / lfds610_slist / lfds610_slist_delete.c
1 #include "lfds610_slist_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 void lfds610_slist_delete( struct lfds610_slist_state *ss )
9 {
10   lfds610_slist_single_threaded_physically_delete_all_elements( ss );
11
12   lfds610_liblfds_aligned_free( ss );
13
14   return;
15 }
16
17
18
19
20
21 /****************************************************************************/
22 int lfds610_slist_logically_delete_element( struct lfds610_slist_state *ss, struct lfds610_slist_element *se )
23 {
24   LFDS610_ALIGN(LFDS610_ALIGN_DOUBLE_POINTER) void
25     *volatile user_data_and_flags[2],
26     *volatile new_user_data_and_flags[2];
27
28   unsigned char
29     cas_rv = 0;
30
31   assert( ss != NULL );
32   assert( se != NULL );
33
34   LFDS610_BARRIER_LOAD;
35
36   user_data_and_flags[LFDS610_SLIST_USER_DATA] = se->user_data_and_flags[LFDS610_SLIST_USER_DATA];
37   user_data_and_flags[LFDS610_SLIST_FLAGS] = se->user_data_and_flags[LFDS610_SLIST_FLAGS];
38
39   do
40   {
41     new_user_data_and_flags[LFDS610_SLIST_USER_DATA] = user_data_and_flags[LFDS610_SLIST_USER_DATA];
42     new_user_data_and_flags[LFDS610_SLIST_FLAGS] = (void *) ((lfds610_atom_t) user_data_and_flags[LFDS610_SLIST_FLAGS] | LFDS610_SLIST_FLAG_DELETED);
43   }
44   while( !((lfds610_atom_t) user_data_and_flags[LFDS610_SLIST_FLAGS] & LFDS610_SLIST_FLAG_DELETED) and 0 == (cas_rv = lfds610_abstraction_dcas((volatile lfds610_atom_t *) se->user_data_and_flags, (lfds610_atom_t *) new_user_data_and_flags, (lfds610_atom_t *) user_data_and_flags)) );
45
46   if( cas_rv == 1 )
47     if( ss->user_data_delete_function != NULL )
48       ss->user_data_delete_function( (void *) user_data_and_flags[LFDS610_SLIST_USER_DATA], ss->user_state );
49
50   return( cas_rv );
51 }
52
53
54
55
56
57 /****************************************************************************/
58 void lfds610_slist_single_threaded_physically_delete_all_elements( struct lfds610_slist_state *ss )
59 {
60   struct lfds610_slist_element
61     *volatile se,
62     *volatile se_temp;
63
64   LFDS610_BARRIER_LOAD;
65
66   se = ss->head;
67
68   while( se != NULL )
69   {
70     // TRD : if a non-deleted element and there is a delete function, call the delete function
71     if( ss->user_data_delete_function != NULL )
72       ss->user_data_delete_function( (void *) se->user_data_and_flags[LFDS610_SLIST_USER_DATA], ss->user_state );
73
74     se_temp = se;
75     se = se->next;
76     lfds610_liblfds_aligned_free( (void *) se_temp );
77   }
78
79   lfds610_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );
80
81   LFDS610_BARRIER_STORE;
82
83   return;
84 }
85