changeset 8951:b628561b185b

(r_alloc_freeze_level): New variable. (r_alloc_freeze, r_alloc_thaw): New functions. (r_alloc_sbrk): Refuse to move blocs, if frozen.
author Karl Heuer <kwzh@gnu.org>
date Tue, 20 Sep 1994 05:51:50 +0000
parents 68ad2f08d735
children 0675fa3d65fa
files src/ralloc.c
diffstat 1 files changed, 30 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/src/ralloc.c	Tue Sep 20 05:40:52 1994 +0000
+++ b/src/ralloc.c	Tue Sep 20 05:51:50 1994 +0000
@@ -333,6 +333,7 @@
 /* Interface routines.  */
 
 static int use_relocatable_buffers;
+static int r_alloc_freeze_level;
 
 /* Obtain SIZE bytes of storage from the free pool, or the system, as
    necessary.  If relocatable blocs are in use, this means relocating
@@ -370,7 +371,7 @@
       /* Get what we need, plus some extra so we can come here less often.  */
       SIZE get = size - already_available + extra_bytes;
 
-      if (! obtain (get))
+      if (r_alloc_freeze_level > 0 || ! obtain (get))
 	return 0;
 
       if (first_bloc)
@@ -381,7 +382,8 @@
       bzero (virtual_break_value, get);
     }
   /* Can we keep extra_bytes of gap while freeing at least extra_bytes?  */
-  else if (size < 0 && already_available - size > 2 * extra_bytes)
+  else if (size < 0 && already_available - size > 2 * extra_bytes
+	   && r_alloc_freeze_level == 0)
     {
       /* Ok, do so.  This is how many to free.  */
       SIZE give_back = already_available - size - extra_bytes;
@@ -481,6 +483,32 @@
 
   return *ptr;
 }
+
+/* Disable relocations, after making room for at least SIZE bytes
+   of non-relocatable heap if possible.  The relocatable blocs are
+   guaranteed to hold still until thawed, even if this means that
+   malloc must return a null pointer.  */
+void
+r_alloc_freeze (size)
+     long size;
+{
+  /* If already frozen, we can't make any more room, so don't try.  */
+  if (r_alloc_freeze_level > 0)
+    size = 0;
+  /* If we can't get the amount requested, half is better than nothing.  */
+  while (size > 0 && r_alloc_sbrk (size) == 0)
+    size /= 2;
+  ++r_alloc_freeze_level;
+  if (size > 0)
+    r_alloc_sbrk (-size);
+}
+
+void
+r_alloc_thaw ()
+{
+  if (--r_alloc_freeze_level < 0)
+    abort ();
+}
 
 /* The hook `malloc' uses for the function which gets more space
    from the system.  */