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