1 #include "lfds610_slist_internal.h"
7 /****************************************************************************/
8 void lfds610_slist_delete( struct lfds610_slist_state *ss )
10 lfds610_slist_single_threaded_physically_delete_all_elements( ss );
12 lfds610_liblfds_aligned_free( ss );
21 /****************************************************************************/
22 int lfds610_slist_logically_delete_element( struct lfds610_slist_state *ss, struct lfds610_slist_element *se )
24 LFDS610_ALIGN(LFDS610_ALIGN_DOUBLE_POINTER) void
25 *volatile user_data_and_flags[2],
26 *volatile new_user_data_and_flags[2];
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];
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);
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)) );
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 );
57 /****************************************************************************/
58 void lfds610_slist_single_threaded_physically_delete_all_elements( struct lfds610_slist_state *ss )
60 struct lfds610_slist_element
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 );
76 lfds610_liblfds_aligned_free( (void *) se_temp );
79 lfds610_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );
81 LFDS610_BARRIER_STORE;