1 #include "lfds600_slist_internal.h"
7 /****************************************************************************/
8 int lfds600_slist_get_user_data_from_element( struct lfds600_slist_element *se, void **user_data )
14 assert( user_data != NULL );
16 *user_data = (void *) se->user_data_and_flags[LFDS600_SLIST_USER_DATA];
18 if( (lfds600_atom_t) se->user_data_and_flags[LFDS600_SLIST_FLAGS] & LFDS600_SLIST_FLAG_DELETED )
28 /****************************************************************************/
29 int lfds600_slist_set_user_data_in_element( struct lfds600_slist_element *se, void *user_data )
31 LFDS600_ALIGN(LFDS600_ALIGN_DOUBLE_POINTER) volatile void
32 *user_data_and_flags[2],
33 *new_user_data_and_flags[2];
39 // TRD : user_data can be NULL
41 user_data_and_flags[LFDS600_SLIST_USER_DATA] = se->user_data_and_flags[LFDS600_SLIST_USER_DATA];
42 user_data_and_flags[LFDS600_SLIST_FLAGS] = se->user_data_and_flags[LFDS600_SLIST_FLAGS];
44 new_user_data_and_flags[LFDS600_SLIST_USER_DATA] = user_data;
48 new_user_data_and_flags[LFDS600_SLIST_FLAGS] = user_data_and_flags[LFDS600_SLIST_FLAGS];
50 while( !((lfds600_atom_t) user_data_and_flags[LFDS600_SLIST_FLAGS] & LFDS600_SLIST_FLAG_DELETED) and 0 == 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) );
52 if( (lfds600_atom_t) user_data_and_flags[LFDS600_SLIST_FLAGS] & LFDS600_SLIST_FLAG_DELETED )
62 /****************************************************************************/
63 struct lfds600_slist_element *lfds600_slist_get_head( struct lfds600_slist_state *ss, struct lfds600_slist_element **se )
68 *se = (struct lfds600_slist_element *) ss->head;
70 lfds600_slist_internal_move_to_first_undeleted_element( se );
79 /****************************************************************************/
80 struct lfds600_slist_element *lfds600_slist_get_next( struct lfds600_slist_element *se, struct lfds600_slist_element **next_se )
83 assert( next_se != NULL );
85 *next_se = (struct lfds600_slist_element *) se->next;
87 lfds600_slist_internal_move_to_first_undeleted_element( next_se );
96 /****************************************************************************/
97 struct lfds600_slist_element *lfds600_slist_get_head_and_then_next( struct lfds600_slist_state *ss, struct lfds600_slist_element **se )
100 assert( se != NULL );
103 lfds600_slist_get_head( ss, se );
105 lfds600_slist_get_next( *se, se );
114 /****************************************************************************/
115 void lfds600_slist_internal_move_to_first_undeleted_element( struct lfds600_slist_element **se )
117 assert( se != NULL );
119 while( *se != NULL and (lfds600_atom_t) (*se)->user_data_and_flags[LFDS600_SLIST_FLAGS] & LFDS600_SLIST_FLAG_DELETED )
120 (*se) = (struct lfds600_slist_element *) (*se)->next;