mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
86 lines
1.3 KiB
86 lines
1.3 KiB
//
|
|
// Copyright (c) 1996 Microsoft Corporation
|
|
//
|
|
//
|
|
// ALLOC.H -- Header for Classes:
|
|
// CAllococator
|
|
//
|
|
//
|
|
// History:
|
|
// 05/22/96 JosephJ Created
|
|
//
|
|
//
|
|
#if (TODO)
|
|
|
|
|
|
class CAllocator
|
|
{
|
|
Allocator(UINT uSize) : m_uSize(uSize)
|
|
{
|
|
ASSERT(!(uSize %sizeof(void *)));
|
|
m_uBlockSize = (uSize+sizeof(void *))
|
|
if (uSize<1000)
|
|
m_uBlockSize = m_uBlockSize*10 + sizeof(void *)
|
|
|
|
m_uBlockSize += sizeof (void*);
|
|
}
|
|
|
|
~Allocator()
|
|
{
|
|
void *pList = m_pBlockList;
|
|
while(pList)
|
|
{
|
|
void *pOld = pList;
|
|
pList = (void *) *pList;
|
|
GlobalFree(pOld);
|
|
}
|
|
}
|
|
|
|
void * Alloc(void)
|
|
{
|
|
m_sync.EnterCrit();
|
|
|
|
void *pvRet = m_pFreeList;
|
|
|
|
if (!m_pFreeList)
|
|
{
|
|
void *pv = GlobalAlloc(LPTR, m_uBlockSize);
|
|
void *pvEnd = pv+m_uBlockSize;
|
|
if (pv)
|
|
{
|
|
*pv = m_pvBlockList;
|
|
m_pvBlockList = pv;
|
|
m_pFreeList = ++pv;
|
|
for(;;pv = *pv)
|
|
{
|
|
*pv = pv + m_uSize + sizeof (void *);
|
|
if (*pv >= pvEnd) {*pv=NULL;break;}
|
|
pv = *pv;
|
|
}
|
|
pvRet = m_pFreeList;
|
|
}
|
|
}
|
|
|
|
m_sync.LeaveCrit();
|
|
|
|
return pvRet;
|
|
}
|
|
|
|
void Free(void *pv)
|
|
{
|
|
m_sync.EnterCrit();
|
|
pv--;
|
|
*pv = m_pFreeList;
|
|
m_pFreeList=*pv;
|
|
m_sync.LeaveCrit();
|
|
}
|
|
|
|
private:
|
|
|
|
void * m_pFreeList;
|
|
void * m_pBlockList;
|
|
const UINT m_uSize;
|
|
UINT m_uBlockSize;
|
|
CSync m_sync;
|
|
}
|
|
#endif (TODO)
|