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
00044 #ifndef CCXX_BUFFER_H_
00045 #define CCXX_BUFFER_H_
00046
00047 #ifndef CCXX_THREAD_H_
00048 #include <cc++/thread.h>
00049 #endif
00050 #ifndef CCXX_STRING_H_
00051 #include <cc++/string.h>
00052 #endif
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 size_t onPeek(void *buf) = 0;
00098
00104 virtual size_t onWait(void *buf) = 0;
00105
00111 virtual size_t onPost(void *buf) = 0;
00112
00113 public:
00118 static const size_t timeout;
00119
00124 Buffer(size_t capacity);
00129 virtual ~Buffer();
00130
00135 inline size_t getSize(void)
00136 {return _size;};
00137
00144 inline size_t getUsed(void)
00145 {return _used;};
00146
00156 size_t wait(void *buf, timeout_t timeout = 0);
00157
00166 size_t post(void *buf, timeout_t timeout = 0);
00167
00174 size_t peek(void *buf);
00175
00180 virtual bool isValid(void);
00181 };
00182
00190 class __EXPORT FixedBuffer : public Buffer
00191 {
00192 private:
00193 char *buf, *head, *tail;
00194 size_t objsize;
00195
00196 protected:
00202 size_t onPeek(void *buf);
00203
00209 size_t onWait(void *buf);
00210
00216 size_t onPost(void *buf);
00217
00218 public:
00226 FixedBuffer(size_t capacity, size_t objsize);
00227
00234 FixedBuffer(const FixedBuffer &fb);
00235
00239 virtual ~FixedBuffer();
00240
00241 FixedBuffer &operator=(const FixedBuffer &fb);
00242
00243 bool isValid(void);
00244 };
00245
00261 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore
00262 {
00263 private:
00264 void run(void);
00265
00266 protected:
00267 typedef struct _data {
00268 struct _data *next;
00269 unsigned len;
00270 char data[1];
00271 } data_t;
00272
00273 timeout_t timeout;
00274 bool started;
00275
00276 data_t *first, *last;
00277
00278 String name;
00279
00280
00281
00282
00283 virtual void final();
00284
00289 virtual void startQueue(void);
00290
00296 virtual void stopQueue(void);
00297
00301 virtual void onTimer(void);
00302
00311 virtual void runQueue(void *data) = 0;
00312
00313 public:
00321 ThreadQueue(const char *id, int pri, size_t stack = 0);
00322
00326 virtual ~ThreadQueue();
00327
00335 void setTimer(timeout_t timeout);
00336
00345 void post(const void *data, unsigned len);
00346 };
00347
00348
00350 inline size_t get(Buffer &b, void *o, timeout_t t = 0)
00351 {return b.wait(o, t);}
00352
00354 inline size_t put(Buffer &b, void *o, timeout_t t = 0)
00355 {return b.post(o, t);}
00356
00358 inline size_t peek(Buffer &b, void *o)
00359 {return b.peek(o);}
00360
00361
00362 #ifdef CCXX_NAMESPACES
00363 }
00364 #endif
00365
00366 #endif
00367