GNU CommonC++
|
00001 // Copyright (C) 1999-2005 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, you may use this file as part of a free software 00018 // library without restriction. Specifically, if other files instantiate 00019 // templates or use macros or inline functions from this file, or you compile 00020 // this file and link it with other files to produce an executable, this 00021 // file does not by itself cause the resulting executable to be covered by 00022 // the GNU General Public License. This exception does not however 00023 // invalidate any other reasons why the executable file might be covered by 00024 // the GNU General Public License. 00025 // 00026 // This exception applies only to the code released under the name GNU 00027 // Common C++. If you copy code from other releases into a copy of GNU 00028 // Common C++, as the General Public License permits, the exception does 00029 // not apply to the code that you add in this way. To avoid misleading 00030 // anyone as to the status of such modified files, you must delete 00031 // this exception notice from them. 00032 // 00033 // If you write modifications of your own for GNU Common C++, it is your choice 00034 // whether to permit this exception to apply to your modifications. 00035 // If you do not wish that, delete this exception notice. 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 00258 class __EXPORT ThreadQueue : public Mutex, public Thread, public Semaphore 00259 { 00260 private: 00261 typedef struct _data { 00262 struct _data *next; 00263 unsigned len; 00264 char data[1]; 00265 } data_t; 00266 00267 timeout_t timeout; 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 00288 virtual void stopQueue(void); 00289 00293 virtual void onTimer(void); 00294 00303 virtual void runQueue(void *data) = 0; 00304 00305 public: 00313 ThreadQueue(const char *id, int pri, size_t stack = 0); 00314 00318 virtual ~ThreadQueue(); 00319 00327 void setTimer(timeout_t timeout); 00328 00337 void post(const void *data, unsigned len); 00338 }; 00339 00340 00342 inline size_t get(Buffer &b, void *o, timeout_t t = 0) 00343 {return b.wait(o, t);} 00344 00346 inline size_t put(Buffer &b, void *o, timeout_t t = 0) 00347 {return b.post(o, t);} 00348 00350 inline size_t peek(Buffer &b, void *o) 00351 {return b.peek(o);} 00352 00353 00354 #ifdef CCXX_NAMESPACES 00355 } 00356 #endif 00357 00358 #endif 00359