annotate prqueue.h @ 11:9d607381c7ca

Took SS out of PI and modified create slots
author Sean Halle <seanhalle@yahoo.com>
date Thu, 26 Sep 2013 07:24:31 -0700
parents 14241f07f742
children f3cb11baf791
rev   line source
seanhalle@3 1 /*
seanhalle@3 2 * Copyright 2009 OpenSourceResearchInstitute.org
seanhalle@3 3 * Licensed under GNU General Public License version 2
seanhalle@3 4 *
seanhalle@3 5 * Author: seanhalle@yahoo.com
seanhalle@3 6 */
seanhalle@3 7
seanhalle@3 8 #ifndef _PRQUEUE_H
seanhalle@3 9 #define _PRQUEUE_H
seanhalle@3 10
seanhalle@3 11 #include <PR__include/PR__primitive_data_types.h>
seanhalle@3 12 #include <pthread.h>
seanhalle@3 13
seanhalle@3 14 #define TRUE 1
seanhalle@3 15 #define FALSE 0
seanhalle@3 16
seanhalle@3 17 //================== Private Queue stuff ===================
seanhalle@3 18 /* It is the data that is shared so only need one mutex. */
seanhalle@3 19 typedef struct
seanhalle@3 20 { void **insertPos;
seanhalle@3 21 void **extractPos;
seanhalle@3 22 void **startOfData; //data is pointers
seanhalle@3 23 void **endOfData; //set when alloc data
seanhalle@3 24 }
seanhalle@3 25 PrivQueueStruc;
seanhalle@3 26
seanhalle@3 27 typedef void (*DynArrayFnPtr) ( void * ); //fn has to cast void *
seanhalle@3 28
seanhalle@3 29 PrivQueueStruc* makePrivQ ( );
seanhalle@3 30 bool32 isEmptyPrivQ ( PrivQueueStruc *Q ); //ret TRUE if empty
seanhalle@3 31 void* peekPrivQ ( PrivQueueStruc *Q ); //ret NULL if empty
seanhalle@3 32 void* readPrivQ ( PrivQueueStruc *Q ); //ret NULL if empty
seanhalle@3 33 void writePrivQ( void *in, PrivQueueStruc *Q );
seanhalle@3 34 //return false when full
seanhalle@3 35 bool32 writeIfSpacePrivQ( void * in, PrivQueueStruc* Q );
seanhalle@3 36 int32 numInPrivQ( PrivQueueStruc *Q );
seanhalle@3 37 void pushPrivQ( void * in, PrivQueueStruc* Q );
seanhalle@3 38 void freePrivQ( PrivQueueStruc *Q );
seanhalle@3 39
seanhalle@3 40
seanhalle@3 41 //====================== Parallel Queue Stuff ====================
seanhalle@3 42
seanhalle@3 43 //========== pThreads based queue ==========
seanhalle@3 44 /* It is the data that is shared so only need one mutex. */
seanhalle@3 45 typedef
seanhalle@3 46 struct
seanhalle@3 47 { pthread_mutex_t mutex_t;
seanhalle@3 48 pthread_cond_t cond_w_t;
seanhalle@3 49 pthread_cond_t cond_r_t;
seanhalle@3 50 int32 count;
seanhalle@3 51 int32 readPos;
seanhalle@3 52 int32 writePos;
seanhalle@3 53 void* data[1024]; //an array of pointers
seanhalle@3 54 int w_empty;
seanhalle@3 55 int w_full;
seanhalle@3 56 }
seanhalle@3 57 PThdQueueStruc;
seanhalle@3 58
seanhalle@3 59 PThdQueueStruc* makePThdQ();
seanhalle@3 60 void* readPThdQ( PThdQueueStruc *Q );
seanhalle@3 61 void writePThdQ( void *in, PThdQueueStruc *Q );
seanhalle@3 62
seanhalle@3 63
seanhalle@3 64 //========== CAS based queue ==========
seanhalle@3 65 typedef
seanhalle@3 66 struct
seanhalle@3 67 { volatile int32 insertLock;
seanhalle@3 68 volatile int32 extractLock;
seanhalle@3 69 volatile void* *insertPos;
seanhalle@3 70 volatile void* *extractPos;
seanhalle@3 71 void* startOfData[1024]; //data is pointers
seanhalle@3 72 void* *endOfData; //set when make queue
seanhalle@3 73 }
seanhalle@3 74 CASQueueStruc;
seanhalle@3 75
seanhalle@3 76 CASQueueStruc* makeCASQ();
seanhalle@3 77 void* readCASQ( CASQueueStruc *Q );
seanhalle@3 78 void writeCASQ( void *in, CASQueueStruc *Q );
seanhalle@3 79
seanhalle@3 80
seanhalle@3 81 //========= non-atomic instr based queue ===========
seanhalle@3 82 typedef
seanhalle@3 83 struct
seanhalle@3 84 { void* *insertPos;
seanhalle@3 85 void* *extractPos;
seanhalle@3 86 void* startOfData[1024]; //data is pointers
seanhalle@3 87 void* *endOfData; //set when make queue
seanhalle@3 88 }
seanhalle@3 89 SRSWQueueStruc;
seanhalle@3 90
seanhalle@3 91 SRSWQueueStruc* makeSRSWQ();
seanhalle@3 92 void freeSRSWQ( SRSWQueueStruc* Q );
seanhalle@3 93 void* readSRSWQ( SRSWQueueStruc *Q );
seanhalle@3 94 void writeSRSWQ( void *in, SRSWQueueStruc *Q );
seanhalle@3 95
seanhalle@3 96
seanhalle@3 97 //========= non-atomic instr S R M W queue ===========
seanhalle@3 98 typedef
seanhalle@3 99 struct
seanhalle@3 100 { int32 lastQReadFrom;
seanhalle@3 101 int32 numInternalQs;
seanhalle@3 102 int32 internalQsSz;
seanhalle@3 103 SRSWQueueStruc* *internalQs;
seanhalle@3 104 }
seanhalle@3 105 SRMWQueueStruc;
seanhalle@3 106
seanhalle@3 107 SRMWQueueStruc* makeSRMWQ();
seanhalle@3 108 int addWriterToSRMWQ( SRMWQueueStruc *Q );
seanhalle@3 109 void* readSRMWQ( SRMWQueueStruc *Q );
seanhalle@3 110 void writeSRMWQ( void *in, SRMWQueueStruc *Q, int writerID );
seanhalle@3 111
seanhalle@3 112
seanhalle@3 113 #endif /* _PRIVATE_QUEUE_H */
seanhalle@3 114