SharedQueue.hGo to the documentation of this file.00001
00002 #ifndef INCLUDED_SharedQueue_h_
00003 #define INCLUDED_SharedQueue_h_
00004
00005 #include "MutexLock.h"
00006 #include "ProcessID.h"
00007 #include "LockScope.h"
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026 template<unsigned int maxsize, unsigned int maxentries>
00027 class SharedQueue {
00028 public:
00029
00030 static const unsigned int MAX_SIZE=maxsize;
00031
00032 static const unsigned int MAX_ENTRIES=maxentries;
00033
00034
00035 SharedQueue();
00036
00037
00038 template<class T> bool SharedQueue<maxsize,maxentries>::push(const T& obj);
00039
00040
00041 void* reserve(unsigned int size);
00042
00043
00044 void done() { lock.release(); }
00045
00046
00047
00048
00049
00050 bool clear(unsigned int taken);
00051
00052
00053 unsigned int size() const { return len; }
00054
00055
00056 unsigned int size(unsigned int i) const { return entries[i].size; }
00057
00058
00059 const void* data(unsigned int i) const { return &buf[entries[i].offset]; }
00060
00061 protected:
00062
00063 unsigned int buf_end() { return len==0?0:entries[len-1].offset+entries[len-1].size; }
00064
00065
00066 unsigned int round_up(unsigned int sz) { return ((sz-1)/sizeof(int)+1)*sizeof(int); }
00067
00068
00069 MutexLock<ProcessID::NumProcesses> lock;
00070
00071 typedef LockScope<ProcessID::NumProcesses> AutoLock;
00072
00073
00074 char buf[MAX_SIZE];
00075
00076
00077 struct entry_t {
00078 unsigned int offset;
00079 unsigned int size;
00080 };
00081
00082
00083 unsigned int len;
00084
00085
00086 entry_t entries[MAX_ENTRIES];
00087 };
00088
00089 template<unsigned int maxsize, unsigned int maxentries>
00090 SharedQueue<maxsize,maxentries>::SharedQueue()
00091 : lock(), len(0)
00092 {}
00093
00094
00095 template<unsigned int maxsize, unsigned int maxentries> template<class T>
00096 bool
00097 SharedQueue<maxsize,maxentries>::push(const T& obj) {
00098 AutoLock autolock(lock,ProcessID::getID());
00099 if(len>=MAX_ENTRIES)
00100 return false;
00101 entries[len].offset=buf_end();
00102 entries[len].size=round_up(sizeof(obj));
00103 if(entries[len].offset+entries[len].size>=MAX_SIZE)
00104 return false;
00105 len++;
00106 return true;
00107 }
00108
00109 template<unsigned int maxsize, unsigned int maxentries>
00110 void*
00111 SharedQueue<maxsize,maxentries>::reserve(unsigned int sz) {
00112 lock.lock(ProcessID::getID());
00113 if(len>=MAX_ENTRIES)
00114 return NULL;
00115 entries[len].offset=buf_end();
00116 entries[len].size=round_up(sz);
00117 if(entries[len].offset+entries[len].size>=MAX_SIZE)
00118 return NULL;
00119 return &buf[entries[len++].offset];
00120 }
00121
00122 template<unsigned int maxsize, unsigned int maxentries>
00123 bool
00124 SharedQueue<maxsize,maxentries>::clear(unsigned int taken) {
00125 AutoLock autolock(lock,ProcessID::getID());
00126 if(size()!=taken)
00127 return false;
00128 len=0;
00129 return true;
00130 }
00131
00132
00133
00134
00135
00136
00137
00138
00139
00140
00141
00142
00143 #endif
|