Me@5: /* Me@5: * File: BlockingQueue.h Me@5: * Author: SeanHalle@yahoo.com Me@5: * Me@5: * Created on November 11, 2009, 12:51 PM Me@5: */ Me@5: Me@5: #ifndef _BLOCKINGQUEUE_H Me@5: #define _BLOCKINGQUEUE_H Me@5: Me@5: #include "pthread.h" Me@5: Me@5: Me@5: #define TRUE 1 Me@5: #define FALSE 0 Me@5: Me@5: #define LOCKED 1 Me@5: #define UNLOCKED 0 Me@5: Me@5: Me@5: //========== pThreads based queue ========== Me@5: /* It is the data that is shared so only need one mutex. */ Me@5: typedef Me@5: struct Me@5: { pthread_mutex_t mutex_t; Me@5: pthread_cond_t cond_w_t; Me@5: pthread_cond_t cond_r_t; Me@5: int count; Me@5: int readPos; Me@5: int writePos; Me@5: void* data[1024]; //an array of pointers Me@5: int w_empty; Me@5: int w_full; Me@5: } Me@5: PThdQueueStruc; Me@5: Me@5: PThdQueueStruc* makePThdQ(); Me@5: void* readPThdQ( PThdQueueStruc *Q ); Me@5: void writePThdQ( void *in, PThdQueueStruc *Q ); Me@5: Me@5: Me@5: //========== CAS based queue ========== Me@5: typedef Me@5: struct Me@9: { int insertLock; Me@9: int extractLock; Me@9: void* *insertPos; Me@9: void* *extractPos; Me@5: void* startOfData[1024]; //data is pointers Me@5: void* *endOfData; //set when make queue Me@5: } Me@5: CASQueueStruc; Me@5: Me@5: CASQueueStruc* makeCASQ(); Me@5: void* readCASQ( CASQueueStruc *Q ); Me@5: void writeCASQ( void *in, CASQueueStruc *Q ); Me@5: Me@5: Me@5: //========= non-atomic instr based queue =========== Me@5: typedef Me@5: struct Me@5: { void* *insertPos; Me@5: void* *extractPos; Me@5: void* startOfData[1024]; //data is pointers Me@5: void* *endOfData; //set when make queue Me@5: } Me@5: SRSWQueueStruc; Me@5: Me@5: SRSWQueueStruc* makeSRSWQ(); Me@7: void freeSRSWQ( SRSWQueueStruc* Q ); Me@5: void* readSRSWQ( SRSWQueueStruc *Q ); Me@7: void writeSRSWQ( void *in, SRSWQueueStruc *Q ); Me@5: Me@5: Me@5: //========= non-atomic instr S R M W queue =========== Me@5: typedef Me@5: struct Me@5: { int lastQReadFrom; Me@5: int numInternalQs; Me@5: int internalQsSz; Me@5: SRSWQueueStruc* *internalQs; Me@5: } Me@5: SRMWQueueStruc; Me@5: Me@5: SRMWQueueStruc* makeSRMWQ(); Me@5: int addWriterToSRMWQ( SRMWQueueStruc *Q ); Me@5: void* readSRMWQ( SRMWQueueStruc *Q ); Me@5: void writeSRMWQ( void *in, SRMWQueueStruc *Q, int writerID ); Me@5: Me@5: Me@5: #endif /* _BLOCKINGQUEUE_H */ Me@5: