Main Page | Namespace List | Class Hierarchy | Alphabetical List | Class List | File List | Namespace Members | Class Members | File Members | Related Pages | Examples

buffer.h

Go to the documentation of this file.
00001 // Copyright (C) 1999-2003 Open Source Telecom Corporation. 00002 // 00003 // This program is free software; you can redistribute it and/or modify 00004 // it under the terms of the GNU General Public License as published by 00005 // the Free Software Foundation; either version 2 of the License, or 00006 // (at your option) any later version. 00007 // 00008 // This program is distributed in the hope that it will be useful, 00009 // but WITHOUT ANY WARRANTY; without even the implied warranty of 00010 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 00011 // GNU General Public License for more details. 00012 // 00013 // You should have received a copy of the GNU General Public License 00014 // along with this program; if not, write to the Free Software 00015 // Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. 00016 // 00017 // As a special exception to the GNU General Public License, permission is 00018 // granted for additional uses of the text contained in its release 00019 // of Common C++. 00020 // 00021 // The exception is that, if you link the Common C++ library with other 00022 // files to produce an executable, this does not by itself cause the 00023 // resulting executable to be covered by the GNU General Public License. 00024 // Your use of that executable is in no way restricted on account of 00025 // linking the Common C++ library code into it. 00026 // 00027 // This exception does not however invalidate any other reasons why 00028 // the executable file might be covered by the GNU General Public License. 00029 // 00030 // This exception applies only to the code released under the 00031 // name Common C++. If you copy code from other releases into a copy of 00032 // Common C++, as the General Public License permits, the exception does 00033 // not apply to the code that you add in this way. To avoid misleading 00034 // anyone as to the status of such modified files, you must delete 00035 // this exception notice from them. 00036 // 00037 // If you write modifications of your own for Common C++, it is your choice 00038 // whether to permit this exception to apply to your modifications. 00039 // If you do not wish that, delete this exception notice. 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; // head/tail of list 00271 00272 void run(void); // private run method 00273 00274 protected: 00275 const char *name; // used for save/restore file 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

Generated on Fri Jan 21 13:36:02 2005 for GNU CommonC++ by doxygen 1.3.8