00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00028 #if ! defined ( BUFFERPOOL_HH )
00029 #define BUFFERPOOL_HH
00030
00031
00032 #include <time.h>
00033
00034
00035 #include <string>
00036 #include <vector>
00037 #include <map>
00038
00039
00040 #include "piave_base.hh"
00041
00042 namespace PIAVE {
00043
00044 class Pool;
00045
00046 class Buffer
00047 {
00048 public:
00049 Buffer() :
00050 _refCount( 0 ), _b( 0 ), _pool( 0 ) {};
00051 uint8_t * buf() const { return _b; }
00052 void setBuffer( uint8_t * b ) { _b=b; }
00053 int getRefCount() const { return _refCount; }
00054 int incRef() { return ++_refCount; }
00055 int dropRef() { if (_refCount==0) { WARN("!!");return 0;} return --_refCount; }
00056 void dropAllRefs() { _refCount = 0; }
00057 Pool * getPool() const { return _pool; }
00058 void setPool( Pool * p ) { _pool = p; }
00059 private:
00060 int _refCount;
00061 uint8_t * _b;
00062 Pool * _pool;
00063
00064 Buffer( const Buffer & o ) {};
00065 Buffer & operator = ( const Buffer & o ) {};
00066 };
00067
00068
00069 #define FBUFSIZE 1024
00070 struct Pool
00071 {
00072 Pool( int s ) : size( s ) {
00073 for ( int i=0; i<FBUFSIZE; i++ ) {
00074 pool[i].setPool( this );
00075 }
00076 }
00077
00078 Buffer pool[FBUFSIZE];
00079 int size;
00080 };
00081 typedef std::map< int, Pool* > PoolMap;
00082
00083
00084
00085
00086
00087
00088 class BufferPool
00089 {
00090 public:
00091 static BufferPool * Inst() {
00092 if (!_instance) {
00093 _instance = new BufferPool();
00094 }
00095 return _instance;
00096 }
00098 static void printStats();
00100
00101
00102
00103 static Buffer * getNewBuffer( size_t size );
00104
00105 private:
00106 BufferPool();
00107 ~BufferPool();
00108
00109 PoolMap _poolMap;
00110
00112 static BufferPool * _instance;
00113 };
00114
00115 };
00116
00117 #endif