#ifndef __QUEUE_INCLUDED #define __QUEUE_INCLUDED #include typedef void (*process_func_t)( void *); typedef struct { void * _data; process_func_t _process; volatile int _done; pthread_mutex_t _elem_lock; } queue_elem_t; typedef struct { size_t _queue_size; queue_elem_t ** _queue; volatile size_t _head, _tail, _next, _size; volatile int _quit; process_func_t _reap; volatile int _last; pthread_mutex_t _queue_lock; pthread_cond_t _queue_insert, _queue_remove; pthread_cond_t _elem_done; size_t _workers; pthread_t * _tid_workers; pthread_t _tid_reaper; } queue_t; /* queue_insert( queue_t *, process_func_t func, void * data) inserts a job into the queue; executes: func( data) */ void queue_insert( queue_t *, process_func_t, void *); /* queue_insert_last( queue_t *); same as queue_insert( queue_t *, NULL, NULL) */ void queue_insert_last( queue_t *); /* queue_wait_last( queue_t *) waits for a (NULL,NULL) job to be processed XXX: queue_insert resets the last flag; */ void queue_wait_last( queue_t *); /* queue_create( size_t queue_size, size_t workers, process_func_t reaper) creates a queue of size #queue_size with #workers workers and calls reaper( job.data) for each enqueued job when done and in sequence returns: queue_t * on success; NULL on error; */ queue_t * queue_create( size_t, size_t, process_func_t); /* queue_destruct( queue_t *) frees resources allocated by queue_create; */ void queue_destruct( queue_t *); #endif