]> pd.if.org Git - liblfds/blob - liblfds/liblfds6.1.0/liblfds610/src/lfds610_queue/lfds610_queue_delete.c
Initial import (all versions, including the new 7.1.0)
[liblfds] / liblfds / liblfds6.1.0 / liblfds610 / src / lfds610_queue / lfds610_queue_delete.c
1 #include "lfds610_queue_internal.h"
2
3
4
5
6
7 /****************************************************************************/
8 void lfds610_queue_delete( struct lfds610_queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state )
9 {
10   void
11     *user_data;
12
13   assert( qs != NULL );
14   // TRD : user_data_delete_function can be NULL
15   // TRD : user_state can be NULL
16
17   // TRD : leading load barrier not required as it will be performed by the dequeue
18
19   while( lfds610_queue_dequeue(qs, &user_data) )
20     if( user_data_delete_function != NULL )
21       user_data_delete_function( user_data, user_state );
22
23   /* TRD : fully dequeuing will leave us
24            with a single dummy element
25            which both qs->enqueue and qs->dequeue point at
26            we push this back onto the lfds610_freelist
27            before we delete the lfds610_freelist
28   */
29
30   lfds610_freelist_push( qs->fs, qs->enqueue[LFDS610_QUEUE_POINTER]->fe );
31
32   lfds610_freelist_delete( qs->fs, lfds610_queue_internal_freelist_delete_function, NULL );
33
34   lfds610_liblfds_aligned_free( qs );
35
36   return;
37 }
38
39
40
41
42
43 /****************************************************************************/
44 #pragma warning( disable : 4100 )
45
46 void lfds610_queue_internal_freelist_delete_function( void *user_data, void *user_state )
47 {
48   assert( user_data != NULL );
49   assert( user_state == NULL );
50
51   lfds610_liblfds_aligned_free( user_data );
52
53   return;
54 }
55
56 #pragma warning( default : 4100 )
57