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 size_t onPeek(
void *buf) = 0;
00103
virtual size_t onWait(
void *buf) = 0;
00109
virtual size_t onPost(
void *buf) = 0;
00110
00111
public:
00116 static const size_t timeout;
00117
00122 Buffer(size_t capacity);
00127
virtual ~Buffer();
00128
00133 inline size_t getSize(
void)
00134 {
return _size;};
00135
00142 inline size_t getUsed(
void)
00143 {
return _used;};
00144
00154 size_t
wait(
void *buf,
timeout_t timeout = 0);
00155
00164 size_t post(
void *buf,
timeout_t timeout = 0);
00165
00172 size_t peek(
void *buf);
00173
00178 virtual bool isValid(
void)
00179 {
return true;};
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
00258 class __EXPORT ThreadQueue :
public Mutex,
public Thread,
public Semaphore
00259 {
00260
private:
00261
typedef struct _data
00262 {
00263
struct _data *next;
00264
unsigned len;
00265
char data[1];
00266 } data_t;
00267
00268
bool started;
00269
00270 data_t *first, *last;
00271
00272
void run(
void);
00273
00274
protected:
00275 const char *name;
00276
00281 virtual void startQueue(
void)
00282 {
return;};
00283
00289 virtual void stopQueue(
void)
00290 {
return;};
00291
00300
virtual void runQueue(
void *data) = 0;
00301
00302
public:
00310 ThreadQueue(
const char *
id,
int pri, size_t stack = 0);
00311
00315 ~ThreadQueue();
00316
00325
void post(
const void *data,
unsigned len);
00326 };
00327
00328
00330 inline size_t get(Buffer &b,
void *o,
timeout_t t = 0)
00331 {
return b.
wait(o, t);}
00332
00334 inline size_t put(Buffer &b,
void *o,
timeout_t t = 0)
00335 {
return b.
post(o, t);}
00336
00338 inline size_t peek(Buffer &b,
void *o)
00339 {
return b.
peek(o);}
00340
00341
00342
#ifdef CCXX_NAMESPACES
00343
}
00344
#endif
00345
00346
#endif
00347