xref: /dflybsd-src/contrib/gcc-8.0/gcc/memory-block.cc (revision 38fd149817dfbff97799f62fcb70be98c4e32523)
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*38fd1498Szrj memory_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*38fd1498Szrj memory_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*38fd1498Szrj mempool_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*38fd1498Szrj mempool_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