From 0dd0ad374ba839a268e864512886aebbe5d49dca Mon Sep 17 00:00:00 2001 From: Eli Zaretskii Date: Mon, 2 Jun 2014 20:08:50 +0300 Subject: [PATCH] Minor improvement of sbrk emulation on MS-Windows. src/w32heap.c (malloc_after_dump, realloc_after_dump): Update the emulated break value only if it goes up. (sbrk): Add assertion that the INCREMENT argument is strictly zero. Improve and correct the commentary. --- src/ChangeLog | 7 +++++++ src/w32heap.c | 27 +++++++++++++++++++-------- 2 files changed, 26 insertions(+), 8 deletions(-) diff --git a/src/ChangeLog b/src/ChangeLog index c68adfcb5b1..c22b925a1d7 100644 --- a/src/ChangeLog +++ b/src/ChangeLog @@ -1,3 +1,10 @@ +2014-06-02 Eli Zaretskii + + * w32heap.c (malloc_after_dump, realloc_after_dump): Update the + emulated break value only if it goes up. + (sbrk): Add assertion that the INCREMENT argument is strictly + zero. Improve and correct the commentary. + 2014-06-02 Paul Eggert Improve AIX-related merge from emacs-24. diff --git a/src/w32heap.c b/src/w32heap.c index 523df909165..c0a17551d27 100644 --- a/src/w32heap.c +++ b/src/w32heap.c @@ -299,9 +299,14 @@ malloc_after_dump (size_t size) /* Use the new private heap. */ void *p = HeapAlloc (heap, 0, size); - /* After dump, keep track of the last allocated byte for sbrk(0). */ + /* After dump, keep track of the "brk value" for sbrk(0). */ if (p) - data_region_end = p + size - 1; + { + unsigned char *new_brk = (unsigned char *)p + size; + + if (new_brk > data_region_end) + data_region_end = new_brk; + } else errno = ENOMEM; return p; @@ -391,9 +396,14 @@ realloc_after_dump (void *ptr, size_t size) else errno = ENOMEM; } - /* After dump, keep track of the last allocated byte for sbrk(0). */ + /* After dump, keep track of the "brk value" for sbrk(0). */ if (p) - data_region_end = p + size - 1; + { + unsigned char *new_brk = (unsigned char *)p + size; + + if (new_brk > data_region_end) + data_region_end = new_brk; + } return p; } @@ -497,10 +507,11 @@ getpagesize (void) void * sbrk (ptrdiff_t increment) { - /* The data_region_end address is the one of the last byte - allocated. The sbrk() function is not emulated at all, except - for a 0 value of its parameter. This is needed by the emacs lisp - function `memory-limit'. */ + /* data_region_end is the address beyond the last allocated byte. + The sbrk() function is not emulated at all, except for a 0 value + of its parameter. This is needed by the Emacs Lisp function + `memory-limit'. */ + eassert (increment == 0); return data_region_end; } -- 2.39.2