]> pd.if.org Git - liblfds/blob - liblfds/liblfds7.1.0/liblfds710/src/lfds710_queue_unbounded_manyproducer_manyconsumer/lfds710_queue_unbounded_manyproducer_manyconsumer_cleanup.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds7.1.0 / liblfds710 / src / lfds710_queue_unbounded_manyproducer_manyconsumer / lfds710_queue_unbounded_manyproducer_manyconsumer_cleanup.c
1 /***** includes *****/
2 #include "lfds710_queue_unbounded_manyproducer_manyconsumer_internal.h"
3
4
5
6
7
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) )
11 {
12   struct lfds710_queue_umm_element
13     *qumme;
14
15   void
16     *value;
17
18   LFDS710_PAL_ASSERT( qumms != NULL );
19   // TRD : element_cleanup_callback can be NULL
20
21   LFDS710_MISC_BARRIER_LOAD;
22
23   if( element_cleanup_callback != NULL )
24   {
25     while( qumms->dequeue[POINTER] != qumms->enqueue[POINTER] )
26     {
27       // TRD : trailing dummy element, so the first real value is in the next element
28       value = qumms->dequeue[POINTER]->next[POINTER]->value;
29
30       // TRD : user is given back *an* element, but not the one his user data was in
31       qumme = qumms->dequeue[POINTER];
32
33       // TRD : remove the element from queue
34       qumms->dequeue[POINTER] = qumms->dequeue[POINTER]->next[POINTER];
35
36       // TRD : write value into the qumme we're going to give the user
37       qumme->value = value;
38
39       element_cleanup_callback( qumms, qumme, LFDS710_MISC_FLAG_LOWERED );
40     }
41
42     // TRD : and now the final element
43     element_cleanup_callback( qumms, (struct lfds710_queue_umm_element *) qumms->dequeue[POINTER], LFDS710_MISC_FLAG_RAISED );
44   }
45
46   return;
47 }
48