1*38fd1498Szrj /* Shared pool of memory blocks for pool allocators. 2*38fd1498Szrj Copyright (C) 2015-2018 Free Software Foundation, Inc. 3*38fd1498Szrj 4*38fd1498Szrj This file is part of GCC. 5*38fd1498Szrj 6*38fd1498Szrj GCC is free software; you can redistribute it and/or modify it under 7*38fd1498Szrj the terms of the GNU General Public License as published by the Free 8*38fd1498Szrj Software Foundation; either version 3, or (at your option) any later 9*38fd1498Szrj version. 10*38fd1498Szrj 11*38fd1498Szrj GCC is distributed in the hope that it will be useful, but WITHOUT ANY 12*38fd1498Szrj WARRANTY; without even the implied warranty of MERCHANTABILITY or 13*38fd1498Szrj FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License 14*38fd1498Szrj for more details. 15*38fd1498Szrj 16*38fd1498Szrj You should have received a copy of the GNU General Public License 17*38fd1498Szrj along with GCC; see the file COPYING3. If not see 18*38fd1498Szrj <http://www.gnu.org/licenses/>. */ 19*38fd1498Szrj 20*38fd1498Szrj #include "config.h" 21*38fd1498Szrj #include "system.h" 22*38fd1498Szrj #include "coretypes.h" 23*38fd1498Szrj #include "memory-block.h" 24*38fd1498Szrj #include "obstack.h" 25*38fd1498Szrj 26*38fd1498Szrj /* Global singleton-like instance. */ 27*38fd1498Szrj memory_block_pool memory_block_pool::instance; 28*38fd1498Szrj memory_block_pool()29*38fd1498Szrjmemory_block_pool::memory_block_pool () : m_blocks (NULL) {} 30*38fd1498Szrj 31*38fd1498Szrj /* Return all blocks from free list to the OS. */ 32*38fd1498Szrj void clear_free_list()33*38fd1498Szrjmemory_block_pool::clear_free_list () 34*38fd1498Szrj { 35*38fd1498Szrj while (m_blocks) 36*38fd1498Szrj { 37*38fd1498Szrj block_list *next = m_blocks->m_next; 38*38fd1498Szrj XDELETEVEC (m_blocks); 39*38fd1498Szrj m_blocks = next; 40*38fd1498Szrj } 41*38fd1498Szrj } 42*38fd1498Szrj 43*38fd1498Szrj /* Allocate a chunk for obstack. Use the pool if requested chunk size matches 44*38fd1498Szrj the size of blocks in the pool. */ 45*38fd1498Szrj void * mempool_obstack_chunk_alloc(size_t size)46*38fd1498Szrjmempool_obstack_chunk_alloc (size_t size) 47*38fd1498Szrj { 48*38fd1498Szrj if (size == memory_block_pool::block_size) 49*38fd1498Szrj return memory_block_pool::allocate (); 50*38fd1498Szrj else 51*38fd1498Szrj return XNEWVEC (char, size); 52*38fd1498Szrj } 53*38fd1498Szrj 54*38fd1498Szrj /* Free previously allocated obstack chunk. */ 55*38fd1498Szrj void mempool_obstack_chunk_free(void * chunk)56*38fd1498Szrjmempool_obstack_chunk_free (void *chunk) 57*38fd1498Szrj { 58*38fd1498Szrj size_t size = (reinterpret_cast<_obstack_chunk *> (chunk)->limit 59*38fd1498Szrj - reinterpret_cast<char *> (chunk)); 60*38fd1498Szrj if (size == memory_block_pool::block_size) 61*38fd1498Szrj memory_block_pool::release (chunk); 62*38fd1498Szrj else 63*38fd1498Szrj XDELETEVEC (chunk); 64*38fd1498Szrj } 65