2 #include "lfds710_queue_unbounded_manyproducer_manyconsumer_internal.h"
8 /****************************************************************************/
9 void lfds710_queue_umm_cleanup( struct lfds710_queue_umm_state *qumms,
10 void (*element_cleanup_callback)(struct lfds710_queue_umm_state *qumms, struct lfds710_queue_umm_element *qumme, enum lfds710_misc_flag dummy_element_flag) )
12 struct lfds710_queue_umm_element
18 LFDS710_PAL_ASSERT( qumms != NULL );
19 // TRD : element_cleanup_callback can be NULL
21 LFDS710_MISC_BARRIER_LOAD;
23 if( element_cleanup_callback != NULL )
25 while( qumms->dequeue[POINTER] != qumms->enqueue[POINTER] )
27 // TRD : trailing dummy element, so the first real value is in the next element
28 value = qumms->dequeue[POINTER]->next[POINTER]->value;
30 // TRD : user is given back *an* element, but not the one his user data was in
31 qumme = qumms->dequeue[POINTER];
33 // TRD : remove the element from queue
34 qumms->dequeue[POINTER] = qumms->dequeue[POINTER]->next[POINTER];
36 // TRD : write value into the qumme we're going to give the user
39 element_cleanup_callback( qumms, qumme, LFDS710_MISC_FLAG_LOWERED );
42 // TRD : and now the final element
43 element_cleanup_callback( qumms, (struct lfds710_queue_umm_element *) qumms->dequeue[POINTER], LFDS710_MISC_FLAG_RAISED );