1 #include "lfds611_slist_internal.h"
\r
7 /****************************************************************************/
\r
8 void lfds611_slist_delete( struct lfds611_slist_state *ss )
\r
10 lfds611_slist_single_threaded_physically_delete_all_elements( ss );
\r
12 lfds611_liblfds_aligned_free( ss );
\r
21 /****************************************************************************/
\r
22 int lfds611_slist_logically_delete_element( struct lfds611_slist_state *ss, struct lfds611_slist_element *se )
\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
31 assert( ss != NULL );
\r
32 assert( se != NULL );
\r
34 LFDS611_BARRIER_LOAD;
\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
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
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
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
57 /****************************************************************************/
\r
58 void lfds611_slist_single_threaded_physically_delete_all_elements( struct lfds611_slist_state *ss )
\r
60 struct lfds611_slist_element
\r
64 LFDS611_BARRIER_LOAD;
\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
76 lfds611_liblfds_aligned_free( (void *) se_temp );
\r
79 lfds611_slist_internal_init_slist( ss, ss->user_data_delete_function, ss->user_state );
\r
81 LFDS611_BARRIER_STORE;
\r