![]() |
Helixis 1.0
Task Programming API
|
00001 #include "queue_internal.h" 00002 #if defined(HLX_BUILD_WITH_PARALLEL_THREADING) 00003 extern hlx_api gl_api; 00004 00005 00006 00007 /****************************************************************************/ 00008 void queue_delete( struct queue_state *qs, void (*user_data_delete_function)(void *user_data, void *user_state), void *user_state ) 00009 { 00010 void 00011 *user_data; 00012 00013 /* TRD : user_data_delete_function can be 0 */ 00014 /* TRD : user_state can be 0 */ 00015 00016 while( queue_dequeue(qs, &user_data) ) 00017 if( user_data_delete_function != 0 ) 00018 user_data_delete_function( user_data, user_state ); 00019 00020 /* TRD : fully dequeuing will leave us 00021 with a single dummy element 00022 which both qs->enqueue and qs->dequeue point at 00023 we push this back onto the freelist 00024 before we delete the freelist 00025 */ 00026 00027 freelist_push( qs->fs, qs->enqueue[QUEUE_POINTER]->fe ); 00028 00029 freelist_delete( qs->fs, queue_internal_freelist_delete_function, 0 ); 00030 00031 gl_api.aligned_free_entry( qs ); 00032 00033 return; 00034 } 00035 00036 00037 00038 00039 00040 /****************************************************************************/ 00041 #pragma warning( disable : 4100 ) 00042 00043 void queue_internal_freelist_delete_function( void *user_data, void *user_state ) 00044 { 00045 gl_api.aligned_free_entry( user_data ); 00046 00047 return; 00048 } 00049 00050 #pragma warning( default : 4100 ) 00051 00052 #endif /* !HLX_BUILD_WITH_PARALLEL_THREADING */