seanhalle@0: /* seanhalle@0: * Copyright 2009 OpenSourceResearchInstitute.org seanhalle@0: * Licensed under GNU General Public License version 2 seanhalle@0: * seanhalle@0: * Author: seanhalle@yahoo.com seanhalle@0: */ seanhalle@0: seanhalle@0: #ifndef _PRQUEUE_H seanhalle@0: #define _PRQUEUE_H seanhalle@0: seanhalle@0: #include seanhalle@0: #include seanhalle@0: seanhalle@0: #define TRUE 1 seanhalle@0: #define FALSE 0 seanhalle@0: seanhalle@0: //================== Private Queue stuff =================== seanhalle@0: /* It is the data that is shared so only need one mutex. */ seanhalle@0: typedef struct seanhalle@0: { void **insertPos; seanhalle@0: void **extractPos; seanhalle@0: void **startOfData; //data is pointers seanhalle@0: void **endOfData; //set when alloc data seanhalle@0: } seanhalle@0: PrivQueueStruc; seanhalle@0: seanhalle@0: typedef void (*DynArrayFnPtr) ( void * ); //fn has to cast void * seanhalle@0: seanhalle@0: PrivQueueStruc* makePrivQ ( ); seanhalle@0: bool32 isEmptyPrivQ ( PrivQueueStruc *Q ); //ret TRUE if empty seanhalle@0: void* peekPrivQ ( PrivQueueStruc *Q ); //ret NULL if empty seanhalle@0: void* readPrivQ ( PrivQueueStruc *Q ); //ret NULL if empty seanhalle@0: void writePrivQ( void *in, PrivQueueStruc *Q ); seanhalle@0: //return false when full seanhalle@0: bool32 writeIfSpacePrivQ( void * in, PrivQueueStruc* Q ); seanhalle@0: int32 numInPrivQ( PrivQueueStruc *Q ); seanhalle@0: void pushPrivQ( void * in, PrivQueueStruc* Q ); seanhalle@0: void freePrivQ( PrivQueueStruc *Q ); seanhalle@0: seanhalle@0: seanhalle@0: //====================== Parallel Queue Stuff ==================== seanhalle@0: seanhalle@0: //========== pThreads based queue ========== seanhalle@0: /* It is the data that is shared so only need one mutex. */ seanhalle@0: typedef seanhalle@0: struct seanhalle@0: { pthread_mutex_t mutex_t; seanhalle@0: pthread_cond_t cond_w_t; seanhalle@0: pthread_cond_t cond_r_t; seanhalle@0: int32 count; seanhalle@0: int32 readPos; seanhalle@0: int32 writePos; seanhalle@0: void* data[1024]; //an array of pointers seanhalle@0: int w_empty; seanhalle@0: int w_full; seanhalle@0: } seanhalle@0: PThdQueueStruc; seanhalle@0: seanhalle@0: PThdQueueStruc* makePThdQ(); seanhalle@0: void* readPThdQ( PThdQueueStruc *Q ); seanhalle@0: void writePThdQ( void *in, PThdQueueStruc *Q ); seanhalle@0: seanhalle@0: seanhalle@0: //========== CAS based queue ========== seanhalle@0: typedef seanhalle@0: struct seanhalle@0: { volatile int32 insertLock; seanhalle@0: volatile int32 extractLock; seanhalle@0: volatile void* *insertPos; seanhalle@0: volatile void* *extractPos; seanhalle@0: void* startOfData[1024]; //data is pointers seanhalle@0: void* *endOfData; //set when make queue seanhalle@0: } seanhalle@0: CASQueueStruc; seanhalle@0: seanhalle@0: CASQueueStruc* makeCASQ(); seanhalle@0: void* readCASQ( CASQueueStruc *Q ); seanhalle@0: void writeCASQ( void *in, CASQueueStruc *Q ); seanhalle@0: seanhalle@0: seanhalle@0: //========= non-atomic instr based queue =========== seanhalle@0: typedef seanhalle@0: struct seanhalle@0: { void* *insertPos; seanhalle@0: void* *extractPos; seanhalle@0: void* startOfData[1024]; //data is pointers seanhalle@0: void* *endOfData; //set when make queue seanhalle@0: } seanhalle@0: SRSWQueueStruc; seanhalle@0: seanhalle@0: SRSWQueueStruc* makeSRSWQ(); seanhalle@0: void freeSRSWQ( SRSWQueueStruc* Q ); seanhalle@0: void* readSRSWQ( SRSWQueueStruc *Q ); seanhalle@0: void writeSRSWQ( void *in, SRSWQueueStruc *Q ); seanhalle@0: seanhalle@0: seanhalle@0: //========= non-atomic instr S R M W queue =========== seanhalle@0: typedef seanhalle@0: struct seanhalle@0: { int32 lastQReadFrom; seanhalle@0: int32 numInternalQs; seanhalle@0: int32 internalQsSz; seanhalle@0: SRSWQueueStruc* *internalQs; seanhalle@0: } seanhalle@0: SRMWQueueStruc; seanhalle@0: seanhalle@0: SRMWQueueStruc* makeSRMWQ(); seanhalle@0: int addWriterToSRMWQ( SRMWQueueStruc *Q ); seanhalle@0: void* readSRMWQ( SRMWQueueStruc *Q ); seanhalle@0: void writeSRMWQ( void *in, SRMWQueueStruc *Q, int writerID ); seanhalle@0: seanhalle@0: seanhalle@0: #endif /* _PRIVATE_QUEUE_H */ seanhalle@0: