1 #include "lfds600_slist_internal.h"
7 /****************************************************************************/
8 void lfds600_slist_delete( struct lfds600_slist_state *ss )
10 lfds600_slist_delete_all_elements( ss );
12 lfds600_abstraction_aligned_free( ss );
21 /****************************************************************************/
22 void lfds600_slist_delete_element( struct lfds600_slist_state *ss, struct lfds600_slist_element *se )
24 LFDS600_ALIGN(LFDS600_ALIGN_DOUBLE_POINTER) void
25 *volatile user_data_and_flags[2],
26 *volatile new_user_data_and_flags[2];
34 user_data_and_flags[LFDS600_SLIST_USER_DATA] = se->user_data_and_flags[LFDS600_SLIST_USER_DATA];
35 user_data_and_flags[LFDS600_SLIST_FLAGS] = se->user_data_and_flags[LFDS600_SLIST_FLAGS];
39 new_user_data_and_flags[LFDS600_SLIST_USER_DATA] = user_data_and_flags[LFDS600_SLIST_USER_DATA];
40 new_user_data_and_flags[LFDS600_SLIST_FLAGS] = (void *) ((lfds600_atom_t) user_data_and_flags[LFDS600_SLIST_FLAGS] | LFDS600_SLIST_FLAG_DELETED);
42 while( !((lfds600_atom_t) user_data_and_flags[LFDS600_SLIST_FLAGS] & LFDS600_SLIST_FLAG_DELETED) and 0 == (cas_rv = lfds600_abstraction_dcas((volatile lfds600_atom_t *) se->user_data_and_flags, (lfds600_atom_t *) new_user_data_and_flags, (lfds600_atom_t *) user_data_and_flags)) );
45 if( ss->user_data_delete_function != NULL )
46 ss->user_data_delete_function( (void *) user_data_and_flags[LFDS600_SLIST_USER_DATA], ss->user_state );
55 /****************************************************************************/
56 void lfds600_slist_delete_all_elements( struct lfds600_slist_state *ss )
58 struct lfds600_slist_element
66 // TRD : if a non-deleted element and there is a delete function, call the delete function
67 if( ss->user_data_delete_function != NULL )
68 ss->user_data_delete_function( (void *) se->user_data_and_flags[LFDS600_SLIST_USER_DATA], ss->user_state );
72 lfds600_abstraction_aligned_free( (void *) se_temp );
75 lfds600_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );