1 #include "lfds611_queue_internal.h"
\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
13 assert( qs != NULL );
\r
14 // TRD : user_data_delete_function can be NULL
\r
15 // TRD : user_state can be NULL
\r
17 // TRD : leading load barrier not required as it will be performed by the dequeue
\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
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
30 lfds611_freelist_push( qs->fs, qs->enqueue[LFDS611_QUEUE_POINTER]->fe );
\r
32 lfds611_freelist_delete( qs->fs, lfds611_queue_internal_freelist_delete_function, NULL );
\r
34 lfds611_liblfds_aligned_free( qs );
\r
43 /****************************************************************************/
\r
44 #pragma warning( disable : 4100 )
\r
46 void lfds611_queue_internal_freelist_delete_function( void *user_data, void *user_state )
\r
48 assert( user_data != NULL );
\r
49 assert( user_state == NULL );
\r
51 lfds611_liblfds_aligned_free( user_data );
\r
56 #pragma warning( default : 4100 )
\r