]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.1/liblfds611/src/lfds611_slist/lfds611_slist_delete.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.1 / liblfds611 / src / lfds611_slist / lfds611_slist_delete.c
1 #include "lfds611_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void lfds611_slist_delete( struct lfds611_slist_state *ss )\r
9 {\r
10   lfds611_slist_single_threaded_physically_delete_all_elements( ss );\r
11 \r
12   lfds611_liblfds_aligned_free( ss );\r
13 \r
14   return;\r
15 }\r
16 \r
17 \r
18 \r
19 \r
20 \r
21 /****************************************************************************/\r
22 int lfds611_slist_logically_delete_element( struct lfds611_slist_state *ss, struct lfds611_slist_element *se )\r
23 {\r
24   LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) void\r
25     *volatile user_data_and_flags[2],\r
26     *volatile new_user_data_and_flags[2];\r
27 \r
28   unsigned char\r
29     cas_rv = 0;\r
30 \r
31   assert( ss != NULL );\r
32   assert( se != NULL );\r
33 \r
34   LFDS611_BARRIER_LOAD;\r
35 \r
36   user_data_and_flags[LFDS611_SLIST_USER_DATA] = se->user_data_and_flags[LFDS611_SLIST_USER_DATA];\r
37   user_data_and_flags[LFDS611_SLIST_FLAGS] = se->user_data_and_flags[LFDS611_SLIST_FLAGS];\r
38 \r
39   do\r
40   {\r
41     new_user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data_and_flags[LFDS611_SLIST_USER_DATA];\r
42     new_user_data_and_flags[LFDS611_SLIST_FLAGS] = (void *) ((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] | LFDS611_SLIST_FLAG_DELETED);\r
43   }\r
44   while( !((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED) and 0 == (cas_rv = lfds611_abstraction_dcas((volatile lfds611_atom_t *) se->user_data_and_flags, (lfds611_atom_t *) new_user_data_and_flags, (lfds611_atom_t *) user_data_and_flags)) );\r
45 \r
46   if( cas_rv == 1 )\r
47     if( ss->user_data_delete_function != NULL )\r
48       ss->user_data_delete_function( (void *) user_data_and_flags[LFDS611_SLIST_USER_DATA], ss->user_state );\r
49 \r
50   return( cas_rv );\r
51 }\r
52 \r
53 \r
54 \r
55 \r
56 \r
57 /****************************************************************************/\r
58 void lfds611_slist_single_threaded_physically_delete_all_elements( struct lfds611_slist_state *ss )\r
59 {\r
60   struct lfds611_slist_element\r
61     *volatile se,\r
62     *volatile se_temp;\r
63 \r
64   LFDS611_BARRIER_LOAD;\r
65 \r
66   se = ss->head;\r
67 \r
68   while( se != NULL )\r
69   {\r
70     // TRD : if a non-deleted element and there is a delete function, call the delete function\r
71     if( ss->user_data_delete_function != NULL )\r
72       ss->user_data_delete_function( (void *) se->user_data_and_flags[LFDS611_SLIST_USER_DATA], ss->user_state );\r
73 \r
74     se_temp = se;\r
75     se = se->next;\r
76     lfds611_liblfds_aligned_free( (void *) se_temp );\r
77   }\r
78 \r
79   lfds611_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );\r
80 \r
81   LFDS611_BARRIER_STORE;\r
82 \r
83   return;\r
84 }\r
85 \r