Return TypeFunction nameArguments
unsigned inthzSSR::Alloc(unsigned int,)

Declared in file: hzSSR.h
Defined in file : hzSSR.cpp

Function Logic:

0:START 1:nSize>=256 2:Return 0 3:!nSize 4:Return 0 5:nUnit 6:m_flistItem[nUnit-1] 7:_hzGlobal_MT 8:hzLockRWD::LockWrite 9:m_flistItem[nUnit-1] 10:items items items items ssrAddr 11:!(ssrAddr&SSR_BLOC_MASK) 12:hzexit 13:hzSSR::Xlate pSlot 14:!pSlot 15:hzexit 16:pSlot->m_Blank[0]!=0xff 17:m_flistItem memset 18:_hzGlobal_MT 19:hzLockRWD::Unlock 20:ssrAddr 21:Return ssrAddr 22:_hzGlobal_MT 23:hzLockRWD::LockWrite 24:!m_pTopBlock||((m_pTopBlock->m_Usage+nUnit)>SSR_BLOC_SPACE) 25:pBloc m_pTopBlock memset hzArray::Add hzArray::Count pBloc pBloc 26:pSeg ssrAddr 27:!(ssrAddr&SSR_BLOC_MASK) 28:hzexit 29:m_pTopBlock memset items items 30:_hzGlobal_MT 31:hzLockRWD::Unlock 32:Return ssrAddr

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