xsbBool smIsValidStructRef(Structure_Manager smRecord, void *ptr) { void *pBlock, *firstStruct, *lastStruct; size_t structSize; structSize = SM_StructSize(smRecord); for ( pBlock = SM_CurBlock(smRecord); IsNonNULL(pBlock); pBlock = SMBlk_NextBlock(pBlock) ) { firstStruct = SMBlk_FirstStruct(pBlock); lastStruct = SMBlk_LastStruct(pBlock,structSize,SM_StructsPerBlock(smRecord)); /* Determine whether pointer lies within block ------------------------------------------- */ if ( (firstStruct <= ptr) && (ptr <= lastStruct) ) { /* Determine whether pointer is a valid reference ---------------------------------------------- */ if ( (((char *)ptr - (char *)firstStruct) MOD structSize) == 0 ) return TRUE; else return FALSE; } } return FALSE; }
void smAllocateBlock(Structure_Manager *pSM) { void *pNewBlock; pNewBlock = mem_calloc(SM_NewBlockSize(*pSM),1,TABLE_SPACE); // if ( IsNULL(pNewBlock) ) // xsb_resource_error_nopred("memory","[smAllocateBlock] Out of memory in allocation of %s block\n", // SM_StructName(*pSM)); SMBlk_NextBlock(pNewBlock) = SM_CurBlock(*pSM); SM_CurBlock(*pSM) = pNewBlock; SM_NextStruct(*pSM) = SMBlk_FirstStruct(pNewBlock); SM_LastStruct(*pSM) = SMBlk_LastStruct(pNewBlock, SM_StructSize(*pSM), SM_StructsPerBlock(*pSM)); dbg_smPrint(LOG_STRUCT_MANAGER, *pSM,"after block allocation"); }
void smAllocateBlock(Structure_Manager *pSM) { void *pNewBlock; dbg_smPrint(LOG_STRUCT_MANAGER, *pSM,"before block allocation"); pNewBlock = malloc(SM_NewBlockSize(*pSM)); if ( IsNULL(pNewBlock) ) xsb_abort("[smAllocateBlock] Out of memory in allocation of %s block\n", SM_StructName(*pSM)); SMBlk_NextBlock(pNewBlock) = SM_CurBlock(*pSM); SM_CurBlock(*pSM) = pNewBlock; SM_NextStruct(*pSM) = SMBlk_FirstStruct(pNewBlock); SM_LastStruct(*pSM) = SMBlk_LastStruct(pNewBlock, SM_StructSize(*pSM), SM_StructsPerBlock(*pSM)); dbg_smPrint(LOG_STRUCT_MANAGER, *pSM,"after block allocation"); }