mirror of
https://git.savannah.gnu.org/git/emacs.git
synced 2025-01-04 11:40:22 +00:00
(write_segment): Write valid data in units of 1<<13,
but write zeros only a page at a time.
This commit is contained in:
parent
a96621c61e
commit
5a31e1d01c
23
src/unexec.c
23
src/unexec.c
@ -1014,15 +1014,18 @@ write_segment (new, ptr, end)
|
||||
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 @@ write_segment (new, ptr, end)
|
||||
&& 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 @@ write_segment (new, ptr, end)
|
||||
ptr, new, nwrite, ret, errno);
|
||||
PERROR (buf);
|
||||
}
|
||||
#endif
|
||||
i += nwrite;
|
||||
ptr += nwrite;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user