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