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