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