1 #include "lfds601_slist_internal.h"
\r
7 /****************************************************************************/
\r
8 int lfds601_slist_get_user_data_from_element( struct lfds601_slist_element *se, void **user_data )
\r
13 assert( se != NULL );
\r
14 assert( user_data != NULL );
\r
16 *user_data = (void *) se->user_data_and_flags[LFDS601_SLIST_USER_DATA];
\r
18 if( (lfds601_atom_t) se->user_data_and_flags[LFDS601_SLIST_FLAGS] & LFDS601_SLIST_FLAG_DELETED )
\r
28 /****************************************************************************/
\r
29 int lfds601_slist_set_user_data_in_element( struct lfds601_slist_element *se, void *user_data )
\r
31 LFDS601_ALIGN(LFDS601_ALIGN_DOUBLE_POINTER) volatile void
\r
32 *user_data_and_flags[2],
\r
33 *new_user_data_and_flags[2];
\r
38 assert( se != NULL );
\r
39 // TRD : user_data can be NULL
\r
41 user_data_and_flags[LFDS601_SLIST_USER_DATA] = se->user_data_and_flags[LFDS601_SLIST_USER_DATA];
\r
42 user_data_and_flags[LFDS601_SLIST_FLAGS] = se->user_data_and_flags[LFDS601_SLIST_FLAGS];
\r
44 new_user_data_and_flags[LFDS601_SLIST_USER_DATA] = user_data;
\r
48 new_user_data_and_flags[LFDS601_SLIST_FLAGS] = user_data_and_flags[LFDS601_SLIST_FLAGS];
\r
50 while( !((lfds601_atom_t) user_data_and_flags[LFDS601_SLIST_FLAGS] & LFDS601_SLIST_FLAG_DELETED) and 0 == lfds601_abstraction_dcas((volatile lfds601_atom_t *) se->user_data_and_flags, (lfds601_atom_t *) new_user_data_and_flags, (lfds601_atom_t *) user_data_and_flags) );
\r
52 if( (lfds601_atom_t) user_data_and_flags[LFDS601_SLIST_FLAGS] & LFDS601_SLIST_FLAG_DELETED )
\r
62 /****************************************************************************/
\r
63 struct lfds601_slist_element *lfds601_slist_get_head( struct lfds601_slist_state *ss, struct lfds601_slist_element **se )
\r
65 assert( ss != NULL );
\r
66 assert( se != NULL );
\r
68 *se = (struct lfds601_slist_element *) ss->head;
\r
70 lfds601_slist_internal_move_to_first_undeleted_element( se );
\r
79 /****************************************************************************/
\r
80 struct lfds601_slist_element *lfds601_slist_get_next( struct lfds601_slist_element *se, struct lfds601_slist_element **next_se )
\r
82 assert( se != NULL );
\r
83 assert( next_se != NULL );
\r
85 *next_se = (struct lfds601_slist_element *) se->next;
\r
87 lfds601_slist_internal_move_to_first_undeleted_element( next_se );
\r
96 /****************************************************************************/
\r
97 struct lfds601_slist_element *lfds601_slist_get_head_and_then_next( struct lfds601_slist_state *ss, struct lfds601_slist_element **se )
\r
99 assert( ss != NULL );
\r
100 assert( se != NULL );
\r
103 lfds601_slist_get_head( ss, se );
\r
105 lfds601_slist_get_next( *se, se );
\r
114 /****************************************************************************/
\r
115 void lfds601_slist_internal_move_to_first_undeleted_element( struct lfds601_slist_element **se )
\r
117 assert( se != NULL );
\r
119 while( *se != NULL and (lfds601_atom_t) (*se)->user_data_and_flags[LFDS601_SLIST_FLAGS] & LFDS601_SLIST_FLAG_DELETED )
\r
120 (*se) = (struct lfds601_slist_element *) (*se)->next;
\r