HashStats hash_statistics(CTXTdeclc Structure_Manager *sm) { HashStats ht_stats; counter num_used_hdrs; BTHTptr pBTHT; BTNptr *ppBTN; ht_stats.hdr = node_statistics(sm); num_used_hdrs = 0; HashStats_NumBuckets(ht_stats) = 0; HashStats_TotalOccupancy(ht_stats) = 0; HashStats_NonEmptyBuckets(ht_stats) = 0; HashStats_BucketSize(ht_stats) = sizeof(void *); pBTHT = (BTHTptr)SM_AllocList(*sm); while ( IsNonNULL(pBTHT) ) { #ifdef DEBUG_ASSERTIONS /* Counter for contents of current hash table ------------------------------------------ */ v counter num_contents = 0; #endif num_used_hdrs++; HashStats_NumBuckets(ht_stats) += BTHT_NumBuckets(pBTHT); HashStats_TotalOccupancy(ht_stats) += BTHT_NumContents(pBTHT); for ( ppBTN = BTHT_BucketArray(pBTHT); ppBTN < BTHT_BucketArray(pBTHT) + BTHT_NumBuckets(pBTHT); ppBTN++ ) if ( IsNonNULL(*ppBTN) ) { #ifdef DEBUG_ASSERTIONS /* Count the objects in each bucket -------------------------------- */ BTNptr pBTN = *ppBTN; do { num_contents++; pBTN = BTN_Sibling(pBTN); } while ( IsNonNULL(pBTN) ); #endif HashStats_NonEmptyBuckets(ht_stats)++; } #ifdef DEBUG_ASSERTIONS /* Compare counter and header values --------------------------------- */ if ( num_contents != BTHT_NumContents(pBTHT) ) xsb_warn(CTXTc "Inconsistent %s Usage Calculations:\n" "\tHash table occupancy mismatch.", SM_StructName(*sm)); #endif pBTHT = BTHT_NextBTHT(pBTHT); } if ( HashStats_NumAllocHeaders(ht_stats) != (num_used_hdrs + HashStats_NumFreeHeaders(ht_stats)) ) xsb_warn(CTXTc "Inconsistent %s Usage Calculations:\n" "\tHeader count mismatch: Alloc: %d Used: %d Free: %d", SM_StructName(*sm), HashStats_NumAllocHeaders(ht_stats), num_used_hdrs, HashStats_NumFreeHeaders(ht_stats)); return ht_stats; }
void smFreeBlocks(Structure_Manager *pSM) { void *pCurBlock, *pNextBlock; pCurBlock = SM_CurBlock(*pSM); while ( IsNonNULL(pCurBlock) ) { pNextBlock = SMBlk_NextBlock(pCurBlock); free(pCurBlock); pCurBlock = pNextBlock; } SM_CurBlock(*pSM) = SM_NextStruct(*pSM) = SM_LastStruct(*pSM) = NULL; SM_AllocList(*pSM) = SM_FreeList(*pSM) = NULL; }
void smFreeBlocks(Structure_Manager *pSM) { void *pCurBlock, *pNextBlock; pCurBlock = SM_CurBlock(*pSM); while ( IsNonNULL(pCurBlock) ) { pNextBlock = SMBlk_NextBlock(pCurBlock); mem_dealloc(pCurBlock,SM_NewBlockSize(*pSM),TABLE_SPACE); pCurBlock = pNextBlock; } SM_CurBlock(*pSM) = SM_NextStruct(*pSM) = SM_LastStruct(*pSM) = NULL; SM_AllocList(*pSM) = SM_FreeList(*pSM) = NULL; }
void smPrint(Structure_Manager smRecord, char *string) { void *pBlock; counter nBlocks; nBlocks = 0; for ( pBlock = SM_CurBlock(smRecord); IsNonNULL(pBlock); pBlock = SMBlk_NextBlock(pBlock) ) nBlocks++; fprintf(stddbg, " Structure Manager for %s (%s)\n" "\tCurBlock: %p\t\tTotal Blocks: %u\n" "\tNextStr: %p\t\tFree List: %p\n" "\tLastStr: %p\t\tAlloc List: %p\n" "\tStructs per block: %u\t\tStruct size: %u bytes\n", SM_StructName(smRecord), string, SM_CurBlock(smRecord), nBlocks, SM_NextStruct(smRecord), SM_FreeList(smRecord), SM_LastStruct(smRecord), SM_AllocList(smRecord), SM_StructsPerBlock(smRecord), SM_StructSize(smRecord)); }