1 #include "lfds601_slist_internal.h"
\r
7 /****************************************************************************/
\r
8 void lfds601_slist_delete( struct lfds601_slist_state *ss )
\r
10 lfds601_slist_delete_all_elements( ss );
\r
12 lfds601_abstraction_aligned_free( ss );
\r
21 /****************************************************************************/
\r
22 void lfds601_slist_delete_element( struct lfds601_slist_state *ss, struct lfds601_slist_element *se )
\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
31 assert( ss != NULL );
\r
32 assert( se != NULL );
\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
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
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
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
55 /****************************************************************************/
\r
56 void lfds601_slist_delete_all_elements( struct lfds601_slist_state *ss )
\r
58 struct lfds601_slist_element
\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
72 lfds601_abstraction_aligned_free( (void *) se_temp );
\r
75 lfds601_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );
\r