summaryrefslogtreecommitdiff
path: root/gcc/memory-block.cc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2019-11-22 15:37:37 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2019-11-22 14:37:37 +0000
commit9fd052e775623581d2d277a1688b9fde94cb18d2 (patch)
tree7f4801c5d1bcb5f9fda27cdbfe254577322eeec0 /gcc/memory-block.cc
parentf2f3dbc67b85af0f1b6c6feb529a67baf011939c (diff)
Release memory-block-pool memory back to malloc.
* ggc-page.c (ggc_collect): Call memory_block_pool::trim. * memory-block.cc (memory_block_pool::clear_free_list): Rename to ... (memory_block_pool::reduce_free_list): ... this one. (memory_block_pool::trim): New static function. * memory-block.h (memory_block_pool::freelist_size): New constant (memory_block_pool::clear_free_list): Rename to ... (memory_block_pool::reduce_free_list): ... this one. (memory_block_pool::trim): Declare. * lto.c (lto_wpa_write_files): Call memory_block_pool::trim. From-SVN: r278616
Diffstat (limited to 'gcc/memory-block.cc')
-rw-r--r--gcc/memory-block.cc34
1 files changed, 28 insertions, 6 deletions
diff --git a/gcc/memory-block.cc b/gcc/memory-block.cc
index 507feaed157..ebf8cdd1e53 100644
--- a/gcc/memory-block.cc
+++ b/gcc/memory-block.cc
@@ -28,15 +28,30 @@ 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. */
+/* Reduce free list to NUM blocks and return remaining to malloc. */
void
-memory_block_pool::clear_free_list ()
+memory_block_pool::reduce_free_list (int num)
{
- while (m_blocks)
+ block_list **blocks = &m_blocks;
+
+ /* First skip NUM blocks. */
+
+ for (;num > 0 && *blocks; num--)
+ blocks = &(*blocks)->m_next;
+
+ if (!*blocks)
+ return;
+
+ /* And free the remainder of them. */
+
+ block_list *to_free = *blocks;
+ *blocks = NULL;
+
+ while (to_free)
{
- block_list *next = m_blocks->m_next;
- XDELETEVEC (m_blocks);
- m_blocks = next;
+ block_list *next = to_free->m_next;
+ XDELETEVEC (to_free);
+ to_free = next;
}
}
@@ -62,3 +77,10 @@ mempool_obstack_chunk_free (void *chunk)
else
XDELETEVEC (chunk);
}
+
+/* Return allocated memory back to malloc (and to system). */
+void
+memory_block_pool::trim (int num)
+{
+ instance.reduce_free_list (num);
+}