changeset 1595:ac1be1d32868

* ralloc.c (relocate_some_blocs): Handle BLOC == NIL_BLOC. (free_bloc): This can now be simplified. * ralloc.c (r_alloc_sbrk): When we allocate new space for the malloc heap, zero it out even if we don't have any blocs in the free list.
author Jim Blandy <jimb@redhat.com>
date Mon, 16 Nov 1992 00:54:08 +0000
parents b476a97ad17e
children 0e105bd23f44
files src/ralloc.c
diffstat 1 files changed, 23 insertions(+), 21 deletions(-) [+]
line wrap: on
line diff
--- a/src/ralloc.c	Mon Nov 16 00:53:26 1992 +0000
+++ b/src/ralloc.c	Mon Nov 16 00:54:08 1992 +0000
@@ -91,7 +91,8 @@
 /* This is the size of a page.  We round memory requests to this boundary.  */
 static int page_size;
 
-/* Whenever we get memory from the system, get this many extra bytes.  */
+/* Whenever we get memory from the system, get this many extra bytes.  This 
+   must be a multiple of page_size.  */
 static int extra_bytes;
 
 /* Macros for rounding.  Note that rounding to any value is possible
@@ -258,6 +259,8 @@
    indicated by ADDRESS.  Direction of relocation is determined by
    the position of ADDRESS relative to BLOC->data.
 
+   If BLOC is NIL_BLOC, nothing is done.
+
    Note that ordering of blocs is not affected by this function. */
 
 static void
@@ -265,21 +268,23 @@
      bloc_ptr bloc;
      POINTER address;
 {
-  register bloc_ptr b;
-  POINTER data_zone = bloc->data;
-  register SIZE data_zone_size = 0;
-  register SIZE offset = bloc->data - address;
-  POINTER new_data_zone = data_zone - offset;
-
-  for (b = bloc; b != NIL_BLOC; b = b->next)
+  if (bloc != NIL_BLOC)
     {
-      data_zone_size += b->size;
-      b->data -= offset;
-      *b->variable = b->data;
+      register SIZE offset = address - bloc->data;
+      register SIZE data_size = 0;
+      register bloc_ptr b;
+      
+      for (b = bloc; b != NIL_BLOC; b = b->next)
+	{
+	  data_size += b->size;
+	  b->data += offset;
+	  *b->variable = b->data;
+	}
+
+      safe_bcopy (address - offset, address, data_size);
     }
+}
 
-  safe_bcopy (data_zone, new_data_zone, data_zone_size);
-}
 
 /* Free BLOC from the chain of blocs, relocating any blocs above it
    and returning BLOC->size bytes to the free area. */
@@ -301,15 +306,14 @@
     {
       first_bloc = bloc->next;
       first_bloc->prev = NIL_BLOC;
-      relocate_some_blocs (bloc->next, bloc->data);
     }
   else
     {
       bloc->next->prev = bloc->prev;
       bloc->prev->next = bloc->next;
-      relocate_some_blocs (bloc->next, bloc->data);
     }
 
+  relocate_some_blocs (bloc->next, bloc->data);
   relinquish (bloc->size);
   free (bloc);
 }
@@ -355,13 +359,11 @@
 	return 0;
 
       if (first_bloc)
-	{
-	  relocate_some_blocs (first_bloc, first_bloc->data + get);
+	relocate_some_blocs (first_bloc, first_bloc->data + get);
 
-	  /* Zero out the space we just allocated, to help catch bugs
-	     quickly.  */
-	  bzero (virtual_break_value, get);
-	}
+      /* Zero out the space we just allocated, to help catch bugs
+	 quickly.  */
+      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)