Horus Doc || C++ Reference || Class Overview   Pixels   Images   Detector   Geometry   Registry || Doxygen's quick Index  

HxMemoryPool.h

00001 /*
00002  *  Copyright (c) 1998, University of Amsterdam, The Netherlands.
00003  *  All rights reserved.
00004  *
00005  *
00006  *  Author(s):
00007  *  Dennis Koelma (koelma@wins.uva.nl)
00008  *  Edo Poll (poll@wins.uva.nl)
00009  */
00010 
00011 #ifndef HxMemoryPool_h
00012 #define HxMemoryPool_h
00013 
00014 #include "HxStd.h"
00015 #include "HxIoFwd.h"
00016 
00017 #ifdef HxMemoryPool_Debug
00018 #include "HxIo.h"
00019 //#include "HxDebug.h"
00020 #endif
00021 
00022 class HxMemoryPoolFactory;
00023 
00024 class HxMemoryPool
00025 {
00026 public:
00027 
00028     void*                       alloc();
00029     void                        free(void* block);
00030 
00031     void                        collectMemory();
00032 
00033     STD_OSTREAM&                put(STD_OSTREAM&) const;
00034 
00035 private:
00036 
00037     class HxMpBlock;
00038     class HxMpPage;
00039 
00040     friend class HxMemoryPoolFactory;
00041 
00042                                 HxMemoryPool(size_t blockSize);
00043                                 ~HxMemoryPool();
00044 
00045     void                        newPage();
00046     static size_t               getBlockSize(size_t blockSize);
00047 
00048     size_t                      _blockSize;
00049     size_t                      _pageSize;
00050 
00051     HxMemoryPool*               _next;
00052 
00053     HxMpBlock*                  _freeList;
00054     HxMpPage*                   _pageList;
00055 
00056     size_t                      _freeCount;
00057 
00058     class HxMpBlock {
00059     public:
00060         HxMpBlock*              next;
00061     };
00062 
00063     class HxMpPage {
00064     public:
00065                                 HxMpPage();
00066         void*                   operator new(size_t, void*);
00067         HxMpPage*               next;
00068     };
00069 };
00070 
00071 inline STD_OSTREAM&
00072 operator<<(STD_OSTREAM& os, const HxMemoryPool& mp)
00073 {
00074     return mp.put(os);
00075 }
00076 
00077 inline void*
00078 HxMemoryPool::alloc()
00079 {
00080 #ifdef HxMemoryPool_Debug
00081     //STD_CERR << "allocate " << _blockSize << " bytes" << STD_ENDL;
00082 #endif
00083     if (!_freeList)
00084         newPage();
00085     void* m = (void *)_freeList;
00086     _freeList = _freeList->next;
00087     --_freeCount;
00088     return m;
00089 }
00090 
00091 inline void
00092 HxMemoryPool::free(void* m)
00093 {
00094 #ifdef HxMemoryPool_Debug
00095     //STD_CERR << "free " << _blockSize << " bytes" << STD_ENDL;
00096 #endif
00097     HxMpBlock* b = (HxMpBlock*)m;
00098     b->next = _freeList;
00099     _freeList = b;
00100     _freeCount++;
00101 }
00102 
00103 inline
00104 HxMemoryPool::HxMpPage::HxMpPage() : next(0) {}
00105 
00106 inline void*
00107 HxMemoryPool::HxMpPage::operator new(size_t, void* m) { return m; }
00108 
00109 #endif

Generated on Tue Feb 3 14:18:39 2004 for C++Reference by doxygen1.2.12 written by Dimitri van Heesch, © 1997-2001