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 #ifndef CCXX_STRING_H_
00050 #include <cc++/string.h>
00051 #endif
00052 #ifdef CCXX_NAMESPACES
00053 namespace ost {
00054 #endif
00055
00077 #ifdef WIN32
00078 class __EXPORT Buffer : public Mutex
00079 #else
00080 class __EXPORT Buffer : public Conditional
00081 #endif
00082 {
00083 private:
00084 #ifdef WIN32
00085 HANDLE sem_head, sem_tail;
00086 #endif
00087 size_t _size;
00088 size_t _used;
00089
00090 protected:
00096 virtual size_t onPeek(void *buf) = 0;
00097
00103 virtual size_t onWait(void *buf) = 0;
00104
00110 virtual size_t onPost(void *buf) = 0;
00111
00112 public:
00117 static const size_t timeout;
00118
00123 Buffer(size_t capacity);
00128 virtual ~Buffer();
00129
00134 inline size_t getSize(void)
00135 {return _size;};
00136
00143 inline size_t getUsed(void)
00144 {return _used;};
00145
00155 size_t wait(void *buf, timeout_t timeout = 0);
00156
00165 size_t post(void *buf, timeout_t timeout = 0);
00166
00173 size_t peek(void *buf);
00174
00179 virtual bool isValid(void);
00180 };
00181
00189 class __EXPORT FixedBuffer : public Buffer
00190 {
00191 private:
00192 char *buf, *head, *tail;
00193 size_t objsize;
00194
00195 protected:
00201 size_t onPeek(void *buf);
00202
00208 size_t onWait(void *buf);
00209
00215 size_t onPost(void *buf);
00216
00217 public:
00225 FixedBuffer(size_t capacity, size_t objsize);
00226
00233 FixedBuffer(const FixedBuffer &fb);
00234
00238 virtual ~FixedBuffer();
00239
00240 FixedBuffer &operator=(const FixedBuffer &fb);
00241
00242 bool isValid(void);
00243 };
00244
00260 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore
00261 {
00262 private:
00263 typedef struct _data {
00264 struct _data *next;
00265 unsigned len;
00266 char data[1];
00267 } data_t;
00268
00269 timeout_t timeout;
00270 bool started;
00271
00272 data_t *first, *last;
00273
00274 void run(void);
00275
00276 protected:
00277 String name;
00278
00283 virtual void startQueue(void);
00284
00290 virtual void stopQueue(void);
00291
00295 virtual void onTimer(void);
00296
00305 virtual void runQueue(void *data) = 0;
00306
00307 public:
00315 ThreadQueue(const char *id, int pri, size_t stack = 0);
00316
00320 virtual ~ThreadQueue();
00321
00329 void setTimer(timeout_t timeout);
00330
00339 void post(const void *data, unsigned len);
00340 };
00341
00342
00344 inline size_t get(Buffer &b, void *o, timeout_t t = 0)
00345 {return b.wait(o, t);}
00346
00348 inline size_t put(Buffer &b, void *o, timeout_t t = 0)
00349 {return b.post(o, t);}
00350
00352 inline size_t peek(Buffer &b, void *o)
00353 {return b.peek(o);}
00354
00355
00356 #ifdef CCXX_NAMESPACES
00357 }
00358 #endif
00359
00360 #endif
00361