1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39
|
/* Simple threaded work queue using POSIX threads.
*/
#ifndef eslWORKQUEUE_INCLUDED
#define eslWORKQUEUE_INCLUDED
#include "esl_config.h"
typedef struct {
pthread_mutex_t queueMutex; /* mutex for queue serialization */
pthread_cond_t readerQueueCond; /* condition variable used to wake up the producer */
pthread_cond_t workerQueueCond; /* condition variable used to wake up the consumers */
void **readerQueue; /* list of objects the the workers have completed */
int readerQueueCnt; /* number of objects in the queue */
int readerQueueHead; /* first object in the queue */
void **workerQueue; /* list of objects ready to be processed by worker threads */
int workerQueueCnt; /* number of objects in the queue */
int workerQueueHead; /* first object in the queue */
int queueSize; /* max number of items a queue will hold */
int pendingWorkers; /* number of consumers waiting for work */
} ESL_WORK_QUEUE;
extern ESL_WORK_QUEUE *esl_workqueue_Create(int size);
extern void esl_workqueue_Destroy(ESL_WORK_QUEUE *queue);
extern int esl_workqueue_Init (ESL_WORK_QUEUE *queue, void *ptr);
extern int esl_workqueue_Complete(ESL_WORK_QUEUE *queue);
extern int esl_workqueue_Reset (ESL_WORK_QUEUE *queue);
extern int esl_workqueue_Remove(ESL_WORK_QUEUE *queue, void **obj);
extern int esl_workqueue_ReaderUpdate(ESL_WORK_QUEUE *queue, void *in, void **out);
extern int esl_workqueue_WorkerUpdate(ESL_WORK_QUEUE *queue, void *in, void **out);
extern int esl_workqueue_Dump(ESL_WORK_QUEUE *queue);
#endif /*eslWORKQUEUE_INCLUDED*/
|