annotate prqueue.h @ 0:d460a47ed2d6

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