]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.0.1/liblfds601/src/lfds601_slist/lfds601_slist_delete.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.0.1 / liblfds601 / src / lfds601_slist / lfds601_slist_delete.c
1 #include "lfds601_slist_internal.h"\r
2 \r
3 \r
4 \r
5 \r
6 \r
7 /****************************************************************************/\r
8 void lfds601_slist_delete( struct lfds601_slist_state *ss )\r
9 {\r
10   lfds601_slist_delete_all_elements( ss );\r
11 \r
12   lfds601_abstraction_aligned_free( ss );\r
13 \r
14   return;\r
15 }\r
16 \r
17 \r
18 \r
19 \r
20 \r
21 /****************************************************************************/\r
22 void lfds601_slist_delete_element( struct lfds601_slist_state *ss, struct lfds601_slist_element *se )\r
23 {\r
24   LFDS601_ALIGN(LFDS601_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   user_data_and_flags[LFDS601_SLIST_USER_DATA] = se->user_data_and_flags[LFDS601_SLIST_USER_DATA];\r
35   user_data_and_flags[LFDS601_SLIST_FLAGS] = se->user_data_and_flags[LFDS601_SLIST_FLAGS];\r
36 \r
37   do\r
38   {\r
39     new_user_data_and_flags[LFDS601_SLIST_USER_DATA] = user_data_and_flags[LFDS601_SLIST_USER_DATA];\r
40     new_user_data_and_flags[LFDS601_SLIST_FLAGS] = (void *) ((lfds601_atom_t) user_data_and_flags[LFDS601_SLIST_FLAGS] | LFDS601_SLIST_FLAG_DELETED);\r
41   }\r
42   while( !((lfds601_atom_t) user_data_and_flags[LFDS601_SLIST_FLAGS] & LFDS601_SLIST_FLAG_DELETED) and 0 == (cas_rv = lfds601_abstraction_dcas((volatile lfds601_atom_t *) se->user_data_and_flags, (lfds601_atom_t *) new_user_data_and_flags, (lfds601_atom_t *) user_data_and_flags)) );\r
43 \r
44   if( cas_rv == 1 )\r
45     if( ss->user_data_delete_function != NULL )\r
46       ss->user_data_delete_function( (void *) user_data_and_flags[LFDS601_SLIST_USER_DATA], ss->user_state );\r
47 \r
48   return;\r
49 }\r
50 \r
51 \r
52 \r
53 \r
54 \r
55 /****************************************************************************/\r
56 void lfds601_slist_delete_all_elements( struct lfds601_slist_state *ss )\r
57 {\r
58   struct lfds601_slist_element\r
59     *volatile se,\r
60     *volatile se_temp;\r
61 \r
62   se = ss->head;\r
63 \r
64   while( se != NULL )\r
65   {\r
66     // TRD : if a non-deleted element and there is a delete function, call the delete function\r
67     if( ss->user_data_delete_function != NULL )\r
68       ss->user_data_delete_function( (void *) se->user_data_and_flags[LFDS601_SLIST_USER_DATA], ss->user_state );\r
69 \r
70     se_temp = se;\r
71     se = se->next;\r
72     lfds601_abstraction_aligned_free( (void *) se_temp );\r
73   }\r
74 \r
75   lfds601_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );\r
76 \r
77   return;\r
78 }\r
79 \r