]> git.sesse.net Git - freerainbowtables/blob - Client Applications/rcracki/tmp/MemoryPool.cpp
initial
[freerainbowtables] / Client Applications / rcracki / tmp / MemoryPool.cpp
1 /*
2    RainbowCrack - a general propose implementation of Philippe Oechslin's faster time-memory trade-off technique.
3
4    Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
5 */
6
7 #include "MemoryPool.h"
8 #include "Public.h"
9
10 CMemoryPool::CMemoryPool()
11 {
12         m_pMem = NULL;
13         m_nMemSize = 0;
14
15         unsigned int nAvailPhys = GetAvailPhysMemorySize();
16         if (nAvailPhys < 16 * 1024 * 1024)
17         {
18                 nAvailPhys = 512 * 1024 * 1024; // There is atleast 256 mb available (Some Linux distros returns a really low GetAvailPhysMemorySize()
19         }
20         if (nAvailPhys < 16 * 1024 * 1024)
21                 m_nMemMax = nAvailPhys / 2;                                     // Leave some memory for CChainWalkSet
22         else
23                 m_nMemMax = nAvailPhys - 8 * 1024 * 1024;       // Leave some memory for CChainWalkSet  
24 }
25
26 CMemoryPool::~CMemoryPool()
27 {
28         if (m_pMem != NULL)
29         {
30                 delete m_pMem;
31                 m_pMem = NULL;
32                 m_nMemSize = 0;
33         }
34 }
35
36 unsigned char* CMemoryPool::Allocate(unsigned int nFileLen, unsigned int& nAllocatedSize)
37 {
38         if (nFileLen <= m_nMemSize)
39         {
40                 nAllocatedSize = nFileLen;
41                 return m_pMem;
42         }
43
44         unsigned int nTargetSize;
45         if (nFileLen < m_nMemMax)
46                 nTargetSize = nFileLen;
47         else
48                 nTargetSize = m_nMemMax;
49
50         // Free existing memory
51         if (m_pMem != NULL)
52         {
53                 delete m_pMem;
54                 m_pMem = NULL;
55                 m_nMemSize = 0;
56         }
57
58         // Allocate new memory
59         //printf("allocating %u bytes memory\n", nTargetSize);
60         m_pMem = new unsigned char[nTargetSize];
61         if (m_pMem != NULL)
62         {
63                 m_nMemSize = nTargetSize;
64                 nAllocatedSize = nTargetSize;
65                 return m_pMem;
66         }
67         else
68         {
69                 nAllocatedSize = 0;
70                 return NULL;
71         }
72 }