| Return Type | Function name | Arguments |
|---|---|---|
| unsigned int | hzSSR::Alloc | (unsigned int,) |
Declared in file: hzSSR.h
Defined in file : hzSSR.cpp
Function Logic:
Function body:
unsigned int hzSSR::Alloc (unsigned int nSize)
{
_hzfunc("hzSSR::Alloc") ;
uint32_t ssrAddr = 0;
uint32_t nUnit ;
if (nSize >&eq; 256)
{
threadLog("SIZE VIOLATION: Max size is 256 bytes\n") ;
return 0;
}
if (!nSize)
return 0;
nUnit = (nSize/8)+ (nSize%8? 1:0);
_ssrBloc* pBloc = 0;
_ssrFLE* pSlot = 0;
uint64_t* pSeg = 0;
if (m_flistItem[nUnit-1])
{
if (_hzGlobal_MT)
m_lockItem[nUnit-1].LockWrite();
if (m_flistItem[nUnit-1])
{
_hzGlobal_Memstats.m_strSm_u[nUnit-1]++;
_hzGlobal_Memstats.m_strSm_f[nUnit-1]--;
m_flistPopl[nUnit-1]--;
m_nAllocOld++ ;
ssrAddr = m_flistItem[nUnit-1];
if (!(ssrAddr & SSR_BLOC_MASK))
hzexit(E_CORRUPT, "Case 1 Illegal String Address %u:%u", (ssrAddr&0x7fff0000)>>16,ssrAddr&0xffff);
pSlot = (_ssrFLE*) Xlate(ssrAddr) ;
if (!pSlot)
hzexit(E_CORRUPT, "Illegal freelist (%d) string address %u:%u", nUnit-1,(ssrAddr&0x7fff0000)>>16,ssrAddr&0xffff);
if (pSlot->m_Blank[0]!= 0xff)
threadLog("CORRUPT: %u unit Slot in free list addr (%u:%u), points elsewhere\n", nUnit, (ssrAddr&0xffff0000)>>16,ssrAddr&0xffff);
m_flistItem[nUnit-1]= pSlot->m_fleNext ;
memset(pSlot, 0,nUnit * 8);
}
if (_hzGlobal_MT)
m_lockItem[nUnit-1].Unlock();
if (ssrAddr)
{
return ssrAddr ;
}
}
if (_hzGlobal_MT)
m_lockSbloc.LockWrite() ;
if (!m_pTopBlock || ((m_pTopBlock->m_Usage + nUnit) > SSR_BLOC_SPACE))
{
m_pTopBlock = pBloc = new _ssrBloc() ;
memset(pBloc, 0,sizeof(_ssrBloc)) ;
m_Super.Add(pBloc) ;
pBloc->m_blkSelf = (m_Super.Count() << 16);
pBloc->m_Usage = 0;
threadLog("CREATED SUPERBLOCK %u at %p\n", pBloc->m_blkSelf >> 16,pBloc);
}
pSeg = m_pTopBlock->m_Space + m_pTopBlock->m_Usage ;
ssrAddr = m_pTopBlock->m_blkSelf + m_pTopBlock->m_Usage ;
if (!(ssrAddr & SSR_BLOC_MASK))
hzexit(E_CORRUPT, "Case 2 Illegal String Address %u:%u", (ssrAddr&0x7fff0000)>>16,ssrAddr&0xffff);
m_pTopBlock->m_Usage += nUnit ;
memset(pSeg, 0,nUnit * 8);
_hzGlobal_Memstats.m_strSm_u[nUnit-1]++;
m_nAllocNew++ ;
if (_hzGlobal_MT)
m_lockSbloc.Unlock() ;
return ssrAddr ;
}