2 #include "lfds700_queue_internal.h"
8 /****************************************************************************/
9 void lfds700_queue_cleanup( struct lfds700_queue_state *qs,
10 void (*element_cleanup_callback)(struct lfds700_queue_state *qs, struct lfds700_queue_element *qe, enum lfds700_misc_flag dummy_element_flag) )
12 struct lfds700_queue_element
18 LFDS700_PAL_ASSERT( qs != NULL );
19 // TRD : element_cleanup_callback can be NULL
21 LFDS700_MISC_BARRIER_LOAD;
23 if( element_cleanup_callback != NULL )
25 while( qs->dequeue[POINTER] != qs->enqueue[POINTER] )
27 // TRD : trailing dummy element, so the first real value is in the next element
28 value = qs->dequeue[POINTER]->next[POINTER]->value;
30 // TRD : user is given back *an* element, but not the one his user data was in
31 qe = qs->dequeue[POINTER];
33 // TRD : remove the element from queue
34 qs->dequeue[POINTER] = qs->dequeue[POINTER]->next[POINTER];
36 // TRD : write value into the qe we're going to give the user
39 element_cleanup_callback( qs, qe, LFDS700_MISC_FLAG_LOWERED );
42 // TRD : and now the final element
43 element_cleanup_callback( qs, (struct lfds700_queue_element *) qs->dequeue[POINTER], LFDS700_MISC_FLAG_RAISED );