>From 77b034d4eca1d66e678bcd3c9d31dfba503a616d Mon Sep 17 00:00:00 2001 From: Paul Eggert Date: Sat, 30 Jan 2016 00:47:25 -0800 Subject: [PATCH 08/12] * src/alloc.c: Include "sheap.h". MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit (alloc_unexec_pre, alloc_unexec_post) [HYBRID_MALLOC]: Set and clear bss_sbrk_did_unexec, on all platforms not just Cygwin. * src/lisp.h (alloc_unexec_pre, alloc_unexec_post) [!DOUG_LEA_MALLOC]: Declare unconditionally. * src/unexcw.c, src/unexelf.c (bss_sbrk_did_unexec): Remove decl. (unexec): Don’t set or clear bss_sbrk_did_unexec; the caller now does this. (Bug#22086) --- src/alloc.c | 37 +++++++++++++++++++++++++------------ src/lisp.h | 5 ----- src/unexcw.c | 4 ---- src/unexelf.c | 8 -------- 4 files changed, 25 insertions(+), 29 deletions(-) diff --git a/src/alloc.c b/src/alloc.c index d379761..617148e 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -35,6 +35,7 @@ along with GNU Emacs. If not, see . */ #include "dispextern.h" #include "intervals.h" #include "puresize.h" +#include "sheap.h" #include "systime.h" #include "character.h" #include "buffer.h" @@ -117,18 +118,6 @@ my_heap_start (void) inside glibc's malloc. */ static void *malloc_state_ptr; -/* Get and free this pointer; useful around unexec. */ -void -alloc_unexec_pre (void) -{ - malloc_state_ptr = malloc_get_state (); -} -void -alloc_unexec_post (void) -{ - free (malloc_state_ptr); -} - /* Restore the dumped malloc state. Because malloc can be invoked even before main (e.g. by the dynamic linker), the dumped malloc state must be restored as early as possible using this special hook. */ @@ -177,6 +166,30 @@ voidfuncptr __MALLOC_HOOK_VOLATILE __malloc_initialize_hook #endif +/* Allocator-related actions to do just before and after unexec. */ + +void +alloc_unexec_pre (void) +{ +#ifdef DOUG_LEA_MALLOC + malloc_state_ptr = malloc_get_state (); +#endif +#ifdef HYBRID_MALLOC + bss_sbrk_did_unexec = true; +#endif +} + +void +alloc_unexec_post (void) +{ +#ifdef DOUG_LEA_MALLOC + free (malloc_state_ptr); +#endif +#ifdef HYBRID_MALLOC + bss_sbrk_did_unexec = false; +#endif +} + /* Mark, unmark, query mark bit of a Lisp string. S must be a pointer to a struct Lisp_String. */ diff --git a/src/lisp.h b/src/lisp.h index 53f123d..3c8e3dd 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3602,13 +3602,8 @@ extern void mark_object (Lisp_Object); #if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC extern void refill_memory_reserve (void); #endif -#ifdef DOUG_LEA_MALLOC extern void alloc_unexec_pre (void); extern void alloc_unexec_post (void); -#else -INLINE void alloc_unexec_pre (void) {} -INLINE void alloc_unexec_post (void) {} -#endif extern const char *pending_malloc_warning; extern Lisp_Object zero_vector; extern Lisp_Object *stack_base; diff --git a/src/unexcw.c b/src/unexcw.c index e4aa356..6ebd8c6 100644 --- a/src/unexcw.c +++ b/src/unexcw.c @@ -30,8 +30,6 @@ along with GNU Emacs. If not, see . */ #define DOTEXE ".exe" -extern int bss_sbrk_did_unexec; - /* ** header for Windows executable files */ @@ -298,9 +296,7 @@ unexec (const char *outfile, const char *infile) ret = emacs_close (fd_in); assert (ret == 0); - bss_sbrk_did_unexec = 1; fixup_executable (fd_out); - bss_sbrk_did_unexec = 0; ret = emacs_close (fd_out); assert (ret == 0); diff --git a/src/unexelf.c b/src/unexelf.c index 3dc0456..e901994 100644 --- a/src/unexelf.c +++ b/src/unexelf.c @@ -211,10 +211,6 @@ entry_address (void *section_h, ptrdiff_t idx, ptrdiff_t entsize) typedef unsigned char byte; -#ifdef HYBRID_MALLOC -extern int bss_sbrk_did_unexec; -#endif - /* **************************************************************** * unexec * @@ -231,10 +227,6 @@ unexec (const char *new_name, const char *old_name) off_t new_file_size; void *new_break; -#ifdef HYBRID_MALLOC - bss_sbrk_did_unexec = 1; -#endif - /* Pointers to the base of the image of the two files. */ caddr_t old_base, new_base; -- 2.5.0