static ChunkArenaPtr findArena() { ChunkArenaPtr arena = NULL; int i; for(i = 0; i < numArenas; i++) { arena = &(chunkArenas[i]); if(arena->bitmap != 0) break; else arena = NULL; } assert(arena != NULL); if(!arena->chunks) { void *p; p = alloc_arena(CHUNK_SIZE * ARENA_CHUNKS); if(p == MAP_FAILED) { do_log_error(L_ERROR, errno, "Couldn't allocate chunk"); maybe_free_chunks(1, 1); return NULL; } arena->chunks = p; } return arena; }
void MemoryManager::_alloc_arena(size_t size) { _numArenas++; _bytes_arena += size; _arena = alloc_arena(_arena,size); assert(((POINTER_SIZE_INT)_arena->next_byte & BITS_TO_CLEAR) == 0); #ifdef JIT_MEM_CHECK checkPointsMutex.lock(); checkPointsByArena[_arena] = new std::vector<size_t>(); checkPointsMutex.unlock(); size_t allocated_size = _arena->last_byte - _arena->bytes; memset(_arena->bytes, JIT_MEM_CHECK_DEFAULT_VAL, allocated_size); #endif }
char* test_arena() { sp_arena* arena = alloc_arena(); sp_block_template tmpl; sp_block* bl1 = NULL; sp_block* bl2 = NULL; sp_placement* pl = NULL; sp_arena_state* st = NULL; tmpl.visual = 7; tmpl.w = 3; tmpl.h = 4; mu_assert(arena, "arena is allocated"); mu_assert(bl1 = new_block(&tmpl), "block 1"); mu_assert(bl2 = new_block(&tmpl), "block 2"); block_add_quality(bl1, B_QUALITY_RECEIVES(SP_EVT_DUMMY, 1)); pl = arena_place(arena, bl1, 5, 6); mu_assert(pl, "placement"); mu_assert(arena_place(arena, bl1, 5, 6) == NULL, "double placement fails"); mu_assert(arena_place(arena, bl2, 5, 6), "other placement"); arena_consume_event(arena, new_sp_event(SP_EVT_DUMMY, 1)); mu_assert(block_has_quality(bl1, B_QUALITY_RECEIVES(SP_EVT_DUMMY, 2)), "events are dispatched"); st = arena_export_state(arena); mu_assert(st->n_blocks == 2, "two blocks in state"); mu_assert(st->blocks[0].w == 3, "w size is correct"); mu_assert(st->blocks[0].h == 4, "h size is correct"); mu_assert(st->blocks[0].x == 5, "x location is correct"); mu_assert(st->blocks[0].y == 6, "y location is correct"); mu_assert(st->blocks[0].visual == 7, "visual is correct"); mu_assert(arena_remove(arena, pl) == bl1, "removal works"); mu_assert(arena_remove_block(arena, bl1) == NULL, "double removal fails"); mu_assert(arena_remove_block(arena, bl2) == bl2, "removal by block successful"); SPFREE(arena); SPFREE(bl1); SPFREE(bl2); SPFREE(st); return NULL; }