00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00043 #ifndef CCXX_BUFFER_H_
00044 #define CCXX_BUFFER_H_
00045
00046 #ifndef CCXX_THREAD_H_
00047 #include <cc++/thread.h>
00048 #endif
00049
00050 #ifdef CCXX_NAMESPACES
00051 namespace ost {
00052 #endif
00053
00075 #ifdef WIN32
00076 class __EXPORT Buffer : public Mutex
00077 #else
00078 class __EXPORT Buffer : public Conditional
00079 #endif
00080 {
00081 private:
00082 #ifdef WIN32
00083 HANDLE sem_head, sem_tail;
00084 #endif
00085 size_t _size;
00086 size_t _used;
00087
00088 protected:
00094 virtual size_t onPeek(void *buf) = 0;
00095
00101 virtual size_t onWait(void *buf) = 0;
00102
00108 virtual size_t onPost(void *buf) = 0;
00109
00110 public:
00115 static const size_t timeout;
00116
00121 Buffer(size_t capacity);
00126 virtual ~Buffer();
00127
00132 inline size_t getSize(void)
00133 {return _size;};
00134
00141 inline size_t getUsed(void)
00142 {return _used;};
00143
00153 size_t wait(void *buf, timeout_t timeout = 0);
00154
00163 size_t post(void *buf, timeout_t timeout = 0);
00164
00171 size_t peek(void *buf);
00172
00177 virtual bool isValid(void);
00178 };
00179
00187 class __EXPORT FixedBuffer : public Buffer
00188 {
00189 private:
00190 char *buf, *head, *tail;
00191 size_t objsize;
00192
00193 protected:
00199 size_t onPeek(void *buf);
00200
00206 size_t onWait(void *buf);
00207
00213 size_t onPost(void *buf);
00214
00215 public:
00223 FixedBuffer(size_t capacity, size_t objsize);
00224
00231 FixedBuffer(const FixedBuffer &fb);
00232
00236 virtual ~FixedBuffer();
00237
00238 FixedBuffer &operator=(const FixedBuffer &fb);
00239
00240 bool isValid(void);
00241 };
00242
00258 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore
00259 {
00260 private:
00261 typedef struct _data {
00262 struct _data *next;
00263 unsigned len;
00264 char data[1];
00265 } data_t;
00266
00267 timeout_t timeout;
00268 bool started;
00269
00270 data_t *first, *last;
00271
00272 void run(void);
00273
00274 protected:
00275 const char *name;
00276
00281 virtual void startQueue(void);
00282
00288 virtual void stopQueue(void);
00289
00293 virtual void onTimer(void);
00294
00303 virtual void runQueue(void *data) = 0;
00304
00305 public:
00313 ThreadQueue(const char *id, int pri, size_t stack = 0);
00314
00318 virtual ~ThreadQueue();
00319
00327 void setTimer(timeout_t timeout);
00328
00337 void post(const void *data, unsigned len);
00338 };
00339
00340
00342 inline size_t get(Buffer &b, void *o, timeout_t t = 0)
00343 {return b.wait(o, t);}
00344
00346 inline size_t put(Buffer &b, void *o, timeout_t t = 0)
00347 {return b.post(o, t);}
00348
00350 inline size_t peek(Buffer &b, void *o)
00351 {return b.peek(o);}
00352
00353
00354 #ifdef CCXX_NAMESPACES
00355 }
00356 #endif
00357
00358 #endif
00359