void IndexSet::populate_free_list() { Compile *compile = Compile::current(); BitBlock *free = (BitBlock*)compile->indexSet_free_block_list(); char *mem = (char*)arena()->Amalloc_4(sizeof(BitBlock) * bitblock_alloc_chunk_size + 32); // Align the pointer to a 32 bit boundary. BitBlock *new_blocks = (BitBlock*)(((uintptr_t)mem + 32) & ~0x001F); // Add the new blocks to the free list. for (int i = 0; i < bitblock_alloc_chunk_size; i++) { new_blocks->set_next(free); free = new_blocks; new_blocks++; } compile->set_indexSet_free_block_list(free); #ifdef ASSERT if (CollectIndexSetStatistics) { _alloc_new += bitblock_alloc_chunk_size; } #endif }
IndexSet::BitBlock *IndexSet::alloc_block() { #ifdef ASSERT if (CollectIndexSetStatistics) { _alloc_total++; } #endif Compile *compile = Compile::current(); BitBlock* free_list = (BitBlock*)compile->indexSet_free_block_list(); if (free_list == NULL) { populate_free_list(); free_list = (BitBlock*)compile->indexSet_free_block_list(); } BitBlock *block = free_list; compile->set_indexSet_free_block_list(block->next()); block->clear(); return block; }