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 ; }