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
00038
00039
00040
00046 #ifndef CCXX_BUFFER_H_
00047 #define CCXX_BUFFER_H_
00048
00049 #ifndef CCXX_THREAD_H_
00050 #include <cc++/thread.h>
00051 #endif
00052
00053 #ifdef CCXX_NAMESPACES
00054 namespace ost {
00055 #endif
00056
00078 #ifdef WIN32
00079 class __EXPORT Buffer : public Mutex
00080 #else
00081 class __EXPORT Buffer : public Conditional
00082 #endif
00083 {
00084 private:
00085 #ifdef WIN32
00086 HANDLE sem_head, sem_tail;
00087 #endif
00088 size_t _size;
00089 size_t _used;
00090
00091 protected:
00097 virtual int onPeek(void *buf) = 0;
00103 virtual int onWait(void *buf) = 0;
00109 virtual int onPost(void *buf) = 0;
00110
00111 public:
00116 Buffer(size_t capacity);
00121 virtual ~Buffer();
00122
00127 inline size_t getSize(void)
00128 {return _size;};
00129
00136 inline size_t getUsed(void)
00137 {return _used;};
00138
00147 int wait(void *buf, timeout_t timeout = 0);
00148
00156 int post(void *buf, timeout_t timeout = 0);
00157
00164 int peek(void *buf);
00165
00170 virtual bool isValid(void)
00171 {return true;};
00172 };
00173
00181 class __EXPORT FixedBuffer : public Buffer
00182 {
00183 private:
00184 char *buf, *head, *tail;
00185 size_t objsize;
00186
00187 protected:
00193 int onPeek(void *buf);
00194
00200 int onWait(void *buf);
00201
00207 int onPost(void *buf);
00208
00209 public:
00217 FixedBuffer(size_t capacity, size_t objsize);
00218
00225 FixedBuffer(const FixedBuffer &fb);
00226
00230 virtual ~FixedBuffer();
00231
00232 FixedBuffer &operator=(const FixedBuffer &fb);
00233
00234 bool isValid(void);
00235 };
00236
00250 class ThreadQueue : public Mutex, public Thread, public Semaphore
00251 {
00252 private:
00253 typedef struct _data
00254 {
00255 struct _data *next;
00256 unsigned len;
00257 char data[1];
00258 } data_t;
00259
00260 bool started;
00261
00262 data_t *first, *last;
00263
00264 void run(void);
00265
00266 protected:
00267 const char *name;
00268
00273 virtual void startQueue(void)
00274 {return;};
00275
00281 virtual void stopQueue(void)
00282 {return;};
00283
00292 virtual void runQueue(void *data) = 0;
00293
00294 public:
00300 ThreadQueue(const char *id, int pri, size_t stack = 0);
00301
00305 ~ThreadQueue();
00306
00315 void post(const void *data, unsigned len);
00316 };
00317
00318
00320 inline int get(Buffer &b, void *o, timeout_t t = 0)
00321 {return b.wait(o, t);};
00322
00324 inline int put(Buffer &b, void *o, timeout_t t = 0)
00325 {return b.post(o, t);};
00326
00328 inline int peek(Buffer &b, void *o)
00329 {return b.peek(o);};
00330
00331
00332 #ifdef CCXX_NAMESPACES
00333 };
00334 #endif
00335
00336 #endif
00337