1 #include "lfds611_slist_internal.h"
\r
7 /****************************************************************************/
\r
8 int lfds611_slist_get_user_data_from_element( struct lfds611_slist_element *se, void **user_data )
\r
13 assert( se != NULL );
\r
14 assert( user_data != NULL );
\r
16 LFDS611_BARRIER_LOAD;
\r
18 *user_data = (void *) se->user_data_and_flags[LFDS611_SLIST_USER_DATA];
\r
20 if( (lfds611_atom_t) se->user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED )
\r
30 /****************************************************************************/
\r
31 int lfds611_slist_set_user_data_in_element( struct lfds611_slist_element *se, void *user_data )
\r
33 LFDS611_ALIGN(LFDS611_ALIGN_DOUBLE_POINTER) void
\r
34 *user_data_and_flags[2],
\r
35 *new_user_data_and_flags[2];
\r
40 assert( se != NULL );
\r
41 // TRD : user_data can be NULL
\r
43 LFDS611_BARRIER_LOAD;
\r
45 user_data_and_flags[LFDS611_SLIST_USER_DATA] = se->user_data_and_flags[LFDS611_SLIST_USER_DATA];
\r
46 user_data_and_flags[LFDS611_SLIST_FLAGS] = se->user_data_and_flags[LFDS611_SLIST_FLAGS];
\r
48 new_user_data_and_flags[LFDS611_SLIST_USER_DATA] = user_data;
\r
52 new_user_data_and_flags[LFDS611_SLIST_FLAGS] = user_data_and_flags[LFDS611_SLIST_FLAGS];
\r
54 while( !((lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED) and
\r
55 0 == 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
57 if( (lfds611_atom_t) user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED )
\r
60 LFDS611_BARRIER_STORE;
\r
69 /****************************************************************************/
\r
70 struct lfds611_slist_element *lfds611_slist_get_head( struct lfds611_slist_state *ss, struct lfds611_slist_element **se )
\r
72 assert( ss != NULL );
\r
73 assert( se != NULL );
\r
75 LFDS611_BARRIER_LOAD;
\r
77 *se = (struct lfds611_slist_element *) ss->head;
\r
79 lfds611_slist_internal_move_to_first_undeleted_element( se );
\r
88 /****************************************************************************/
\r
89 struct lfds611_slist_element *lfds611_slist_get_next( struct lfds611_slist_element *se, struct lfds611_slist_element **next_se )
\r
91 assert( se != NULL );
\r
92 assert( next_se != NULL );
\r
94 LFDS611_BARRIER_LOAD;
\r
96 *next_se = (struct lfds611_slist_element *) se->next;
\r
98 lfds611_slist_internal_move_to_first_undeleted_element( next_se );
\r
100 return( *next_se );
\r
107 /****************************************************************************/
\r
108 struct lfds611_slist_element *lfds611_slist_get_head_and_then_next( struct lfds611_slist_state *ss, struct lfds611_slist_element **se )
\r
110 assert( ss != NULL );
\r
111 assert( se != NULL );
\r
114 lfds611_slist_get_head( ss, se );
\r
116 lfds611_slist_get_next( *se, se );
\r
125 /****************************************************************************/
\r
126 void lfds611_slist_internal_move_to_first_undeleted_element( struct lfds611_slist_element **se )
\r
128 assert( se != NULL );
\r
130 while( *se != NULL and (lfds611_atom_t) (*se)->user_data_and_flags[LFDS611_SLIST_FLAGS] & LFDS611_SLIST_FLAG_DELETED )
\r
131 (*se) = (struct lfds611_slist_element *) (*se)->next;
\r