static Bool vmChunkDestroy(Tree tree, void *closureP, Size closureS) { Chunk chunk; VMChunk vmChunk; AVERT(Tree, tree); AVER(closureP == UNUSED_POINTER); UNUSED(closureP); AVER(closureS == UNUSED_SIZE); UNUSED(closureS); chunk = ChunkOfTree(tree); AVERT(Chunk, chunk); vmChunk = Chunk2VMChunk(chunk); AVERT(VMChunk, vmChunk); chunkUnmapSpare(chunk); SparseArrayFinish(&vmChunk->pages); vmChunk->sig = SigInvalid; ChunkFinish(chunk); return TRUE; }
Res ChunkNodeDescribe(Tree node, mps_lib_FILE *stream) { Chunk chunk; if (!TreeCheck(node)) return ResFAIL; if (stream == NULL) return ResFAIL; chunk = ChunkOfTree(node); if (!TESTT(Chunk, chunk)) return ResFAIL; return WriteF(stream, 0, "[$P,$P)", (WriteFP)chunk->base, (WriteFP)chunk->limit, NULL); }
Bool ChunkOfAddr(Chunk *chunkReturn, Arena arena, Addr addr) { Tree tree; AVER_CRITICAL(chunkReturn != NULL); AVERT_CRITICAL(Arena, arena); /* addr is arbitrary */ if (TreeFind(&tree, ArenaChunkTree(arena), TreeKeyOfAddrVar(addr), ChunkCompare) == CompareEQUAL) { Chunk chunk = ChunkOfTree(tree); AVER_CRITICAL(chunk->base <= addr); AVER_CRITICAL(addr < chunk->limit); *chunkReturn = chunk; return TRUE; } return FALSE; }
Compare ChunkCompare(Tree tree, TreeKey key) { Addr base1, base2, limit2; Chunk chunk; AVERT_CRITICAL(Tree, tree); AVER_CRITICAL(tree != TreeEMPTY); /* See .chunk.at.base. */ chunk = ChunkOfTree(tree); AVERT_CRITICAL(Chunk, chunk); base1 = AddrOfTreeKey(key); base2 = chunk->base; limit2 = chunk->limit; if (base1 < base2) return CompareLESS; else if (base1 >= limit2) return CompareGREATER; else return CompareEQUAL; }
TreeKey ChunkKey(Tree tree) { /* See .chunk.at.base. */ Chunk chunk = ChunkOfTree(tree); return TreeKeyOfAddrVar(chunk); }