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
00148 int wait(void *buf, timeout_t timeout = 0);
00149
00158 int post(void *buf, timeout_t timeout = 0);
00159
00166 int peek(void *buf);
00167
00172 virtual bool isValid(void)
00173 {return true;};
00174 };
00175
00183 class __EXPORT FixedBuffer : public Buffer
00184 {
00185 private:
00186 char *buf, *head, *tail;
00187 size_t objsize;
00188
00189 protected:
00195 int onPeek(void *buf);
00196
00202 int onWait(void *buf);
00203
00209 int onPost(void *buf);
00210
00211 public:
00219 FixedBuffer(size_t capacity, size_t objsize);
00220
00227 FixedBuffer(const FixedBuffer &fb);
00228
00232 virtual ~FixedBuffer();
00233
00234 FixedBuffer &operator=(const FixedBuffer &fb);
00235
00236 bool isValid(void);
00237 };
00238
00252 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore
00253 {
00254 private:
00255 typedef struct _data
00256 {
00257 struct _data *next;
00258 unsigned len;
00259 char data[1];
00260 } data_t;
00261
00262 bool started;
00263
00264 data_t *first, *last;
00265
00266 void run(void);
00267
00268 protected:
00269 const char *name;
00270
00275 virtual void startQueue(void)
00276 {return;};
00277
00283 virtual void stopQueue(void)
00284 {return;};
00285
00294 virtual void runQueue(void *data) = 0;
00295
00296 public:
00304 ThreadQueue(const char *id, int pri, size_t stack = 0);
00305
00309 ~ThreadQueue();
00310
00319 void post(const void *data, unsigned len);
00320 };
00321
00322
00324 inline int get(Buffer &b, void *o, timeout_t t = 0)
00325 {return b.wait(o, t);}
00326
00328 inline int put(Buffer &b, void *o, timeout_t t = 0)
00329 {return b.post(o, t);}
00330
00332 inline int peek(Buffer &b, void *o)
00333 {return b.peek(o);}
00334
00335
00336 #ifdef CCXX_NAMESPACES
00337 }
00338 #endif
00339
00340 #endif
00341