1 #include "lfds610_slist_internal.h"
7 /****************************************************************************/
8 int lfds610_slist_get_user_data_from_element( struct lfds610_slist_element *se, void **user_data )
14 assert( user_data != NULL );
18 *user_data = (void *) se->user_data_and_flags[LFDS610_SLIST_USER_DATA];
20 if( (lfds610_atom_t) se->user_data_and_flags[LFDS610_SLIST_FLAGS] & LFDS610_SLIST_FLAG_DELETED )
30 /****************************************************************************/
31 int lfds610_slist_set_user_data_in_element( struct lfds610_slist_element *se, void *user_data )
33 LFDS610_ALIGN(LFDS610_ALIGN_DOUBLE_POINTER) void
34 *user_data_and_flags[2],
35 *new_user_data_and_flags[2];
41 // TRD : user_data can be NULL
45 user_data_and_flags[LFDS610_SLIST_USER_DATA] = se->user_data_and_flags[LFDS610_SLIST_USER_DATA];
46 user_data_and_flags[LFDS610_SLIST_FLAGS] = se->user_data_and_flags[LFDS610_SLIST_FLAGS];
48 new_user_data_and_flags[LFDS610_SLIST_USER_DATA] = user_data;
52 new_user_data_and_flags[LFDS610_SLIST_FLAGS] = user_data_and_flags[LFDS610_SLIST_FLAGS];
54 while( !((lfds610_atom_t) user_data_and_flags[LFDS610_SLIST_FLAGS] & LFDS610_SLIST_FLAG_DELETED) and
55 0 == 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) );
57 if( (lfds610_atom_t) user_data_and_flags[LFDS610_SLIST_FLAGS] & LFDS610_SLIST_FLAG_DELETED )
60 LFDS610_BARRIER_STORE;
69 /****************************************************************************/
70 struct lfds610_slist_element *lfds610_slist_get_head( struct lfds610_slist_state *ss, struct lfds610_slist_element **se )
77 *se = (struct lfds610_slist_element *) ss->head;
79 lfds610_slist_internal_move_to_first_undeleted_element( se );
88 /****************************************************************************/
89 struct lfds610_slist_element *lfds610_slist_get_next( struct lfds610_slist_element *se, struct lfds610_slist_element **next_se )
92 assert( next_se != NULL );
96 *next_se = (struct lfds610_slist_element *) se->next;
98 lfds610_slist_internal_move_to_first_undeleted_element( next_se );
107 /****************************************************************************/
108 struct lfds610_slist_element *lfds610_slist_get_head_and_then_next( struct lfds610_slist_state *ss, struct lfds610_slist_element **se )
110 assert( ss != NULL );
111 assert( se != NULL );
114 lfds610_slist_get_head( ss, se );
116 lfds610_slist_get_next( *se, se );
125 /****************************************************************************/
126 void lfds610_slist_internal_move_to_first_undeleted_element( struct lfds610_slist_element **se )
128 assert( se != NULL );
130 while( *se != NULL and (lfds610_atom_t) (*se)->user_data_and_flags[LFDS610_SLIST_FLAGS] & LFDS610_SLIST_FLAG_DELETED )
131 (*se) = (struct lfds610_slist_element *) (*se)->next;