// // File: hzSSR.h // // Legal Notice: This file is part of the HadronZoo C++ Class Library. // // Copyright 2025 HadronZoo Project (http://www.hadronzoo.com) // // The HadronZoo C++ Class Library is free software: You can redistribute it, and/or modify it under the terms of the GNU Lesser General Public License, as published by the Free // Software Foundation, either version 3 of the License, or any later version. // // The HadronZoo C++ Class Library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR // A PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details. // // You should have received a copy of the GNU Lesser General Public License along with the HadronZoo C++ Class Library. If not, see http://www.gnu.org/licenses. //
/* ** SSR: Small Strings Allocation and Management Regime ** ** The primary objective of SSR is to reduce memory allocation overheads for small strings and string-like entities, which are expected to have large populations. Unlike a general ** memory allocation regime which can make no assumptions about the entities allocated, a regime for strings can exploit the following aspects:- ** ** - Strings do not need to be aligned to 4 or 8 byte boundaries. ** - Strings are always null-terminated ** - Instances of the various string and string-like classes, carry the size of the string with them. This negates the need for the regime to hold size information. */
#ifndef hzSSR_h #define hzSSR_h
#include <string.h>
#include "hzErrcode.h" #include "hzLock.h"
#define SSR_BLOC_MASK 0xffff0000 // Bits 1 to 15 inclusive for block part of address #define SSR_BLOC_SPACE 65536 // Total size of the string space blocks in multiples of 8 bytes
/* ** Definitions */
struct _ssrFLE { // The slot is used as an entry in a free list. Upon string space allocation, slots are either advanced or removed from the free list. The space occupied by the slot is then // used as string space.
uchar m_Blank[4] ; // m_Blank[0] is set to 0xff on item deletion uint32_t m_fleNext ; // Pointer to next free slot } ;
struct _ssrBloc { // Small string space superblock
uint32_t m_blkSelf ; // Address of block //uint32_t m_Resv ; // Reserved for now uint32_t m_Usage ; // Space used (so position of free space) //uint16_t m_nItems ; // Number of total items //uint16_t m_nFree ; // Total volume of deleted items //uint16_t m_nDead ; // Number of deleted items uint64_t m_Space[SSR_BLOC_SPACE] ; // Areas for string spaces
_ssrBloc (void) { m_blkSelf = 0 ; m_Usage = 0 ; //m_nItems = m_nFree = m_nDead = 0 ; } } ;
class hzSSR //_ssrRegime { public: // Blocks hzArray <_ssrBloc*> m_Super ; //_ssrBloc* m_Super[64] ; // Max of 4096 string value 512K superblocks _ssrBloc* m_pTopBlock ; // Latest small string space superblock (only one from which new string spaces can be allocated) uint64_t m_nAllocNew ; // Total number of new allocations uint64_t m_nAllocOld ; // Total number of allocations from free list uint64_t m_nReleases ; // Total number of releases
// Locks hzLockRWD m_lockItem[64] ; // String allocation locks hzLockRWD m_lockSbloc ; // Lock for allocating superblocks hzLockRWD m_lockOsize ; // Lock for allocating/freeing of oversize strings
// Freelists (depends on size) uint32_t m_flistItem[64] ; // Freelists for string spaces of sizes 8 to 256 bytes uint32_t m_flistPopl[64] ; // Population of the string space freelists
//uint32_t m_nBloc ; // Superblock population uint32_t m_nLive ; // Live string population
hzSSR (void) { m_pTopBlock = 0 ; //m_nBloc = 0 ; m_nAllocNew = m_nAllocOld = m_nReleases = 0 ; //m_nBloc = m_nLive = 0 ;
//memset(m_Super, 0, 64 * sizeof(_ssrBloc*)) ; memset(m_flistItem, 0, 64 * sizeof(uint32_t)) ; memset(m_flistPopl, 0, 64 * sizeof(uint32_t)) ; }
// Memory operations uchar* Xlate (uint32_t ssrAddr) ; uint32_t Alloc (uint32_t nSize) ; hzEcode Free (uint32_t strAddr, uint32_t nSize) ;
// Integrity Report void Report (hzChain& report) ; } ;
#endif // hzString_h