/* Allocate a shadow chunk, put it on the appropriate list. If needed, release oldest blocks from freed list. */ static MC_Chunk* create_MC_Chunk ( ThreadId tid, Addr p, SizeT szB, MC_AllocKind kind) { MC_Chunk* mc = VG_(allocEltPA)(MC_(chunk_poolalloc)); mc->data = p; mc->szB = szB; mc->allockind = kind; switch ( MC_(n_where_pointers)() ) { case 2: mc->where[1] = 0; // fallback to 1 case 1: mc->where[0] = 0; // fallback to 0 case 0: break; default: tl_assert(0); } MC_(set_allocated_at) (tid, mc); /* Each time a new MC_Chunk is created, release oldest blocks if the free list volume is exceeded. */ if (VG_(free_queue_volume) > MC_(clo_freelist_vol)) release_oldest_block(); /* Paranoia ... ensure the MC_Chunk is off-limits to the client, so the mc->data field isn't visible to the leak checker. If memory management is working correctly, any pointer returned by VG_(malloc) should be noaccess as far as the client is concerned. */ if (!MC_(check_mem_is_noaccess)( (Addr)mc, sizeof(MC_Chunk), NULL )) { VG_(tool_panic)("create_MC_Chunk: shadow area is accessible"); } return mc; }
/* Allocate a shadow chunk, put it on the appropriate list. If needed, release oldest blocks from freed list. */ static MC_Chunk* create_MC_Chunk ( ExeContext* ec, Addr p, SizeT szB, MC_AllocKind kind) { MC_Chunk* mc = VG_(allocEltPA)(MC_(chunk_poolalloc)); mc->data = p; mc->szB = szB; mc->allockind = kind; mc->where = ec; /* Each time a new MC_Chunk is created, release oldest blocks if the free list volume is exceeded. */ if (VG_(free_queue_volume) > MC_(clo_freelist_vol)) release_oldest_block(); /* Paranoia ... ensure the MC_Chunk is off-limits to the client, so the mc->data field isn't visible to the leak checker. If memory management is working correctly, any pointer returned by VG_(malloc) should be noaccess as far as the client is concerned. */ if (!MC_(check_mem_is_noaccess)( (Addr)mc, sizeof(MC_Chunk), NULL )) { VG_(tool_panic)("create_MC_Chunk: shadow area is accessible"); } return mc; }