1 /************************************************************************** 2 **SA Network Connection Profiler [sancp] - A TCP/IP statistical/collection tool 3 * ************************************************************************ 4 * * Copyright (C) 2003 John Curry <john.curry@metre.net> 5 * * 6 * * This program is distributed under the terms of version 1.0 of the 7 * * Q Public License. See LICENSE.QPL for further details. 8 * * 9 * * This program is distributed in the hope that it will be useful, 10 * * but WITHOUT ANY WARRANTY; without even the implied warranty of 11 * * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. 12 * * 13 * ***********************************************************************/ 14 15 16 17 #ifndef __MEMORYPOOL_H__ 18 #define __MEMORYPOOL_H__ 19 20 //#define NULL 0 21 #define BYTE unsigned char 22 #define CRITICAL_SECTION bool 23 #include <stdio.h> 24 //void InitializeCriticalSection( CRITICAL_SECTION m_critsec ) { return; } 25 //void DeleteCriticalSection( CRITICAL_SECTION m_critsec ) { return; } 26 //void EnterCriticalSection( CRITICAL_SECTION m_critsec ) { return; } 27 //void LeaveCriticalSection( CRITICAL_SECTION m_critsec ) { return; } 28 29 //unsigned int min (unsigned int x,unsigned int y){ return (x>y)?x:y; } 30 31 class CBuffer; 32 33 class CBufferCollection 34 { 35 CBuffer* m_pHead; 36 CBuffer* m_pTail; 37 unsigned int m_dwSize; 38 public: 39 bool equals(CBuffer*); 40 void update(CBuffer*); 41 42 43 CBufferCollection(); 44 ~CBufferCollection(); 45 void AddHead(CBuffer* pBuffer); 46 CBuffer* RemoveTail(); 47 void Remove(CBuffer* pBuffer); 48 CBuffer* Head(); 49 CBuffer* Tail(); 50 unsigned int Count(); 51 void Clear(); 52 }; 53 54 55 class CMemoryPool 56 { 57 protected: 58 59 CBufferCollection m_usedPool; 60 CBufferCollection m_freePool; 61 unsigned int m_dwBufferSize; 62 unsigned int m_dwCount; 63 bool m_bAutoGrow; 64 65 CRITICAL_SECTION m_critsec; 66 67 //inline void Enter() { EnterCriticalSection(&m_critsec); } 68 //inline void Leave() { LeaveCriticalSection(&m_critsec); } 69 //inline void Enter() { printf("Enter\n"); } 70 //inline void Leave() { printf("Leave\n"); } Enter()71 inline void Enter() { return; } Leave()72 inline void Leave() { return; } 73 74 public: 75 76 CMemoryPool(bool bAutoGrow = false, unsigned int dwBufferSize = 4096, unsigned int dwInitialCount = 1099); 77 ~CMemoryPool(); 78 CBuffer* Alloc(); 79 void Free(CBuffer* pBuffer); 80 unsigned int GetTotalBuffers(); 81 unsigned int GetUsedBuffers(); 82 unsigned int GetFreeBuffers(); 83 unsigned int GetBufferSize(); 84 bool Resize(unsigned long dwNewCount); 85 bool ResizeD(long iCountDiff); 86 bool IsAutoGrow(); 87 }; 88 89 class CBuffer 90 { 91 private: 92 CBuffer(CMemoryPool* pPool); 93 ~CBuffer(); 94 95 CMemoryPool* m_pPool; 96 BYTE* m_pBuffer; 97 unsigned int m_dwSize; 98 99 CBuffer* m_pNext; 100 CBuffer* m_pPrev; 101 public: 102 friend class CMemoryPool; 103 friend class CBufferCollection; 104 105 void Free(); 106 BYTE* GetBuffer(); 107 108 109 unsigned int GetBufferSize(); 110 unsigned int GetSizeUsed(); 111 unsigned int SetSizeUsed(unsigned int dwSizeUsed); 112 }; 113 114 115 #endif //__MEMORYPOOL_H__ 116 117 118