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
00256 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore
00257 {
00258 private:
00259 typedef struct _data
00260 {
00261 struct _data *next;
00262 unsigned len;
00263 char data[1];
00264 } data_t;
00265
00266 bool started;
00267
00268 data_t *first, *last;
00269
00270 void run(void);
00271
00272 protected:
00273 const char *name;
00274
00279 virtual void startQueue(void);
00280
00286 virtual void stopQueue(void);
00287
00296 virtual void runQueue(void *data) = 0;
00297
00298 public:
00306 ThreadQueue(const char *id, int pri, size_t stack = 0);
00307
00311 ~ThreadQueue();
00312
00321 void post(const void *data, unsigned len);
00322 };
00323
00324
00326 inline size_t get(Buffer &b, void *o, timeout_t t = 0)
00327 {return b.wait(o, t);}
00328
00330 inline size_t put(Buffer &b, void *o, timeout_t t = 0)
00331 {return b.post(o, t);}
00332
00334 inline size_t peek(Buffer &b, void *o)
00335 {return b.peek(o);}
00336
00337
00338 #ifdef CCXX_NAMESPACES
00339 }
00340 #endif
00341
00342 #endif
00343