]> git.sesse.net Git - freerainbowtables/blobdiff - Client Applications/rcracki_mt/MemoryPool.cpp
rcracki_mt updated to rti2
[freerainbowtables] / Client Applications / rcracki_mt / MemoryPool.cpp
diff --git a/Client Applications/rcracki_mt/MemoryPool.cpp b/Client Applications/rcracki_mt/MemoryPool.cpp
new file mode 100644 (file)
index 0000000..2129daa
--- /dev/null
@@ -0,0 +1,81 @@
+/*
+   RainbowCrack - a general propose implementation of Philippe Oechslin's faster time-memory trade-off technique.
+
+   Copyright (C) Zhu Shuanglei <shuanglei@hotmail.com>
+*/
+
+#include "MemoryPool.h"
+#include "Public.h"
+
+CMemoryPool::CMemoryPool(unsigned int bytesForChainWalkSet)
+{
+       m_pMem = NULL;
+       m_nMemSize = 0;
+
+       unsigned int nAvailPhys = GetAvailPhysMemorySize();
+       if (nAvailPhys < 32 * 1024 * 1024)
+       {
+               nAvailPhys = 256 * 1024 * 1024; // There is atleast 256 mb available (Some Linux distros returns a really low GetAvailPhysMemorySize())
+       }
+       
+       m_nMemMax = nAvailPhys - bytesForChainWalkSet;  // Leave memory for CChainWalkSet       
+
+       if (m_nMemMax < 16 * 1024 * 1024)
+               m_nMemMax = 16 * 1024 * 1024;
+
+}
+
+CMemoryPool::~CMemoryPool()
+{
+       if (m_pMem != NULL)
+       {
+               delete m_pMem;
+               m_pMem = NULL;
+               m_nMemSize = 0;
+       }
+}
+
+unsigned char* CMemoryPool::Allocate(unsigned int nFileLen, unsigned int& nAllocatedSize)
+{
+       if (nFileLen <= m_nMemSize)
+       {
+               nAllocatedSize = nFileLen;
+               return m_pMem;
+       }
+
+       unsigned int nTargetSize;
+       if (nFileLen < m_nMemMax)
+               nTargetSize = nFileLen;
+       else
+               nTargetSize = m_nMemMax;
+
+       // Free existing memory
+       if (m_pMem != NULL)
+       {
+               delete m_pMem;
+               m_pMem = NULL;
+               m_nMemSize = 0;
+       }
+
+       // Allocate new memory
+       //printf("allocating %u bytes memory\n", nTargetSize);
+       m_pMem = new (nothrow) unsigned char[nTargetSize];
+       while (m_pMem == NULL && nTargetSize >= 32 * 1024 * 1024 )
+       {
+          nTargetSize -= 16 * 1024 * 1024;
+          m_pMem = new (nothrow) unsigned char[nTargetSize];
+       }
+
+       if (m_pMem != NULL)
+       {
+               m_nMemSize = nTargetSize;
+               nAllocatedSize = nTargetSize;
+               return m_pMem;
+       }
+       else
+       {
+               m_nMemSize = 0;
+               nAllocatedSize = 0;
+               return NULL;
+       }
+}