# HG changeset patch # User Richard M. Stallman # Date 813180597 0 # Node ID a7e0445bd152f5ff72477f070eb5729b4dd2e4f9 # Parent 5297bf53ac3814b8e7eb0df7a0ec5194f93d9026 (write_segment): Write valid data in units of 1<<13, but write zeros only a page at a time. diff -r 5297bf53ac38 -r a7e0445bd152 src/unexec.c --- 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; }