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