mirror of git://gcc.gnu.org/git/gcc.git
				
				
				
			
		
			
				
	
	
		
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
			
		
		
	
	
			65 lines
		
	
	
		
			1.8 KiB
		
	
	
	
		
			C++
		
	
	
	
| /* Shared pool of memory blocks for pool allocators.
 | |
|    Copyright (C) 2015-2019 Free Software Foundation, Inc.
 | |
| 
 | |
| This file is part of GCC.
 | |
| 
 | |
| GCC is free software; you can redistribute it and/or modify it under
 | |
| the terms of the GNU General Public License as published by the Free
 | |
| Software Foundation; either version 3, or (at your option) any later
 | |
| version.
 | |
| 
 | |
| GCC is distributed in the hope that it will be useful, but WITHOUT ANY
 | |
| WARRANTY; without even the implied warranty of MERCHANTABILITY or
 | |
| FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
 | |
| for more details.
 | |
| 
 | |
| You should have received a copy of the GNU General Public License
 | |
| along with GCC; see the file COPYING3.  If not see
 | |
| <http://www.gnu.org/licenses/>.  */
 | |
| 
 | |
| #include "config.h"
 | |
| #include "system.h"
 | |
| #include "coretypes.h"
 | |
| #include "memory-block.h"
 | |
| #include "obstack.h"
 | |
| 
 | |
| /* Global singleton-like instance.  */
 | |
| memory_block_pool memory_block_pool::instance;
 | |
| 
 | |
| memory_block_pool::memory_block_pool () : m_blocks (NULL) {}
 | |
| 
 | |
| /* Return all blocks from free list to the OS.  */
 | |
| void
 | |
| memory_block_pool::clear_free_list ()
 | |
| {
 | |
|   while (m_blocks)
 | |
|     {
 | |
|       block_list *next = m_blocks->m_next;
 | |
|       XDELETEVEC (m_blocks);
 | |
|       m_blocks = next;
 | |
|     }
 | |
| }
 | |
| 
 | |
| /* Allocate a chunk for obstack.  Use the pool if requested chunk size matches
 | |
|    the size of blocks in the pool.  */
 | |
| void *
 | |
| mempool_obstack_chunk_alloc (size_t size)
 | |
| {
 | |
|   if (size == memory_block_pool::block_size)
 | |
|     return memory_block_pool::allocate ();
 | |
|   else
 | |
|     return XNEWVEC (char, size);
 | |
| }
 | |
| 
 | |
| /* Free previously allocated obstack chunk.  */
 | |
| void
 | |
| mempool_obstack_chunk_free (void *chunk)
 | |
| {
 | |
|   size_t size = (reinterpret_cast<_obstack_chunk *> (chunk)->limit
 | |
| 		 - reinterpret_cast<char *> (chunk));
 | |
|   if (size == memory_block_pool::block_size)
 | |
|     memory_block_pool::release (chunk);
 | |
|   else
 | |
|     XDELETEVEC (chunk);
 | |
| }
 |