changeset 13152:a7e0445bd152

(write_segment): Write valid data in units of 1<<13, but write zeros only a page at a time.
author Richard M. Stallman <rms@gnu.org>
date Sun, 08 Oct 1995 19:29:57 +0000
parents 5297bf53ac38
children c9694633f7ca
files src/unexec.c
diffstat 1 files changed, 18 insertions(+), 5 deletions(-) [+]
line wrap: on
line diff
--- a/src/unexec.c	Sun Oct 08 19:26:07 1995 +0000
+++ b/src/unexec.c	Sun Oct 08 19:29:57 1995 +0000
@@ -1014,15 +1014,18 @@
   register int i, nwrite, ret;
   char buf[80];
   extern int errno;
+  /* This is the normal amount to write at once.
+     It is the size of block that NFS uses.  */
+  int writesize = 1 << 13;
   int pagesize = getpagesize ();
-  char *zeros = (char *) alloca (pagesize);
+  char zeros[1 << 13];
 
-  bzero (zeros, pagesize);
+  bzero (zeros, sizeof (zeros));
 
   for (i = 0; ptr < end;)
     {
-      /* distance to next multiple of pagesize.  */
-      nwrite = (((int) ptr + pagesize) & -pagesize) - (int) ptr;
+      /* Distance to next multiple of writesize.  */
+      nwrite = (((int) ptr + writesize) & -writesize) - (int) ptr;
       /* But not beyond specified end.  */
       if (nwrite > end - ptr) nwrite = end - ptr;
       ret = write (new, ptr, nwrite);
@@ -1035,7 +1038,16 @@
 	  && errno == EFAULT
 #endif
 	  )
-	write (new, zeros, nwrite);
+	{
+	  /* Write only a page of zeros at once,
+	     so that we we don't overshoot the start
+	     of the valid memory in the old data segment.  */
+	  if (nwrite > pagesize)
+	    nwrite = pagesize;
+	  write (new, zeros, nwrite);
+	}
+#if 0 /* Now that we have can ask `write' to write more than a page,
+	 it is legit for write do less than the whole amount specified.  */
       else if (nwrite != ret)
 	{
 	  sprintf (buf,
@@ -1043,6 +1055,7 @@
 		   ptr, new, nwrite, ret, errno);
 	  PERROR (buf);
 	}
+#endif
       i += nwrite;
       ptr += nwrite;
     }