aboutsummaryrefslogtreecommitdiffstats
path: root/src
diff options
context:
space:
mode:
authorPaul Eggert2016-01-30 13:56:23 -0800
committerPaul Eggert2016-01-30 13:56:23 -0800
commit99fa8c3dbf333f1e3fa7d6449d4b4428ce439ce1 (patch)
treefc459c16ca5f7204aa5a21529f8a189bfb45f831 /src
parent3005605776955593e0b416de9e1ebf158114343e (diff)
parent875577bcc8d6139d61f91118d0907b847912b3e1 (diff)
downloademacs-99fa8c3dbf333f1e3fa7d6449d4b4428ce439ce1.tar.gz
emacs-99fa8c3dbf333f1e3fa7d6449d4b4428ce439ce1.zip
-
Diffstat (limited to 'src')
-rw-r--r--src/alloc.c76
-rw-r--r--src/emacs.c78
-rw-r--r--src/keyboard.c5
-rw-r--r--src/keyboard.h2
-rw-r--r--src/lisp.h8
5 files changed, 88 insertions, 81 deletions
diff --git a/src/alloc.c b/src/alloc.c
index 03dacc77c6e..d379761c168 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -92,6 +92,18 @@ static bool valgrind_p;
92#include "w32heap.h" /* for sbrk */ 92#include "w32heap.h" /* for sbrk */
93#endif 93#endif
94 94
95#if defined DOUG_LEA_MALLOC || defined GNU_LINUX
96/* The address where the heap starts. */
97void *
98my_heap_start (void)
99{
100 static void *start;
101 if (! start)
102 start = sbrk (0);
103 return start;
104}
105#endif
106
95#ifdef DOUG_LEA_MALLOC 107#ifdef DOUG_LEA_MALLOC
96 108
97#include <malloc.h> 109#include <malloc.h>
@@ -101,7 +113,69 @@ static bool valgrind_p;
101 113
102#define MMAP_MAX_AREAS 100000000 114#define MMAP_MAX_AREAS 100000000
103 115
104#endif /* not DOUG_LEA_MALLOC */ 116/* A pointer to the memory allocated that copies that static data
117 inside glibc's malloc. */
118static void *malloc_state_ptr;
119
120/* Get and free this pointer; useful around unexec. */
121void
122alloc_unexec_pre (void)
123{
124 malloc_state_ptr = malloc_get_state ();
125}
126void
127alloc_unexec_post (void)
128{
129 free (malloc_state_ptr);
130}
131
132/* Restore the dumped malloc state. Because malloc can be invoked
133 even before main (e.g. by the dynamic linker), the dumped malloc
134 state must be restored as early as possible using this special hook. */
135static void
136malloc_initialize_hook (void)
137{
138 static bool malloc_using_checking;
139
140 if (! initialized)
141 {
142 my_heap_start ();
143 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
144 }
145 else
146 {
147 if (!malloc_using_checking)
148 {
149 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
150 ignored if the heap to be restored was constructed without
151 malloc checking. Can't use unsetenv, since that calls malloc. */
152 char **p = environ;
153 if (p)
154 for (; *p; p++)
155 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
156 {
157 do
158 *p = p[1];
159 while (*++p);
160
161 break;
162 }
163 }
164
165 malloc_set_state (malloc_state_ptr);
166# ifndef XMALLOC_OVERRUN_CHECK
167 alloc_unexec_post ();
168# endif
169 }
170}
171
172# ifndef __MALLOC_HOOK_VOLATILE
173# define __MALLOC_HOOK_VOLATILE
174# endif
175voidfuncptr __MALLOC_HOOK_VOLATILE __malloc_initialize_hook
176 = malloc_initialize_hook;
177
178#endif
105 179
106/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer 180/* Mark, unmark, query mark bit of a Lisp string. S must be a pointer
107 to a struct Lisp_String. */ 181 to a struct Lisp_String. */
diff --git a/src/emacs.c b/src/emacs.c
index 7c818f59c5c..fb6f896a639 100644
--- a/src/emacs.c
+++ b/src/emacs.c
@@ -133,20 +133,7 @@ bool might_dump;
133extern void unexec_init_emacs_zone (void); 133extern void unexec_init_emacs_zone (void);
134#endif 134#endif
135 135
136#ifdef DOUG_LEA_MALLOC
137/* Preserves a pointer to the memory allocated that copies that
138 static data inside glibc's malloc. */
139static void *malloc_state_ptr;
140/* From glibc, a routine that returns a copy of the malloc internal state. */
141extern void *malloc_get_state (void);
142/* From glibc, a routine that overwrites the malloc internal state. */
143extern int malloc_set_state (void *);
144/* True if the MALLOC_CHECK_ environment variable was set while
145 dumping. Used to work around a bug in glibc's malloc. */
146static bool malloc_using_checking;
147#elif defined HAVE_PTHREAD && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
148extern void malloc_enable_thread (void); 136extern void malloc_enable_thread (void);
149#endif
150 137
151/* If true, Emacs should not attempt to use a window-specific code, 138/* If true, Emacs should not attempt to use a window-specific code,
152 but instead should use the virtual terminal under which it was started. */ 139 but instead should use the virtual terminal under which it was started. */
@@ -165,11 +152,6 @@ bool display_arg;
165 Tells GC how to save a copy of the stack. */ 152 Tells GC how to save a copy of the stack. */
166char *stack_bottom; 153char *stack_bottom;
167 154
168#if defined (DOUG_LEA_MALLOC) || defined (GNU_LINUX)
169/* The address where the heap starts (from the first sbrk (0) call). */
170static void *my_heap_start;
171#endif
172
173#ifdef GNU_LINUX 155#ifdef GNU_LINUX
174/* The gap between BSS end and heap start as far as we can tell. */ 156/* The gap between BSS end and heap start as far as we can tell. */
175static uprintmax_t heap_bss_diff; 157static uprintmax_t heap_bss_diff;
@@ -654,51 +636,6 @@ argmatch (char **argv, int argc, const char *sstr, const char *lstr,
654 } 636 }
655} 637}
656 638
657#ifdef DOUG_LEA_MALLOC
658
659/* malloc can be invoked even before main (e.g. by the dynamic
660 linker), so the dumped malloc state must be restored as early as
661 possible using this special hook. */
662
663static void
664malloc_initialize_hook (void)
665{
666 if (initialized)
667 {
668 if (!malloc_using_checking)
669 /* Work around a bug in glibc's malloc. MALLOC_CHECK_ must be
670 ignored if the heap to be restored was constructed without
671 malloc checking. Can't use unsetenv, since that calls malloc. */
672 {
673 char **p;
674
675 for (p = environ; p && *p; p++)
676 if (strncmp (*p, "MALLOC_CHECK_=", 14) == 0)
677 {
678 do
679 *p = p[1];
680 while (*++p);
681 break;
682 }
683 }
684
685 malloc_set_state (malloc_state_ptr);
686#ifndef XMALLOC_OVERRUN_CHECK
687 free (malloc_state_ptr);
688#endif
689 }
690 else
691 {
692 if (my_heap_start == 0)
693 my_heap_start = sbrk (0);
694 malloc_using_checking = getenv ("MALLOC_CHECK_") != NULL;
695 }
696}
697
698void (*__malloc_initialize_hook) (void) EXTERNALLY_VISIBLE = malloc_initialize_hook;
699
700#endif /* DOUG_LEA_MALLOC */
701
702/* Close standard output and standard error, reporting any write 639/* Close standard output and standard error, reporting any write
703 errors as best we can. This is intended for use with atexit. */ 640 errors as best we can. This is intended for use with atexit. */
704static void 641static void
@@ -746,10 +683,8 @@ main (int argc, char **argv)
746#ifdef GNU_LINUX 683#ifdef GNU_LINUX
747 if (!initialized) 684 if (!initialized)
748 { 685 {
749 if (my_heap_start == 0) 686 char *heap_start = my_heap_start ();
750 my_heap_start = sbrk (0); 687 heap_bss_diff = heap_start - max (my_endbss, my_endbss_static);
751
752 heap_bss_diff = (char *)my_heap_start - max (my_endbss, my_endbss_static);
753 } 688 }
754#endif 689#endif
755 690
@@ -2148,15 +2083,12 @@ You must run Emacs in batch mode in order to dump it. */)
2148 memory_warnings (my_edata, malloc_warning); 2083 memory_warnings (my_edata, malloc_warning);
2149#endif /* not WINDOWSNT */ 2084#endif /* not WINDOWSNT */
2150#endif /* not SYSTEM_MALLOC and not HYBRID_MALLOC */ 2085#endif /* not SYSTEM_MALLOC and not HYBRID_MALLOC */
2151#ifdef DOUG_LEA_MALLOC 2086
2152 malloc_state_ptr = malloc_get_state (); 2087 alloc_unexec_pre ();
2153#endif
2154 2088
2155 unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0); 2089 unexec (SSDATA (filename), !NILP (symfile) ? SSDATA (symfile) : 0);
2156 2090
2157#ifdef DOUG_LEA_MALLOC 2091 alloc_unexec_post ();
2158 free (malloc_state_ptr);
2159#endif
2160 2092
2161#ifdef WINDOWSNT 2093#ifdef WINDOWSNT
2162 Vlibrary_cache = Qnil; 2094 Vlibrary_cache = Qnil;
diff --git a/src/keyboard.c b/src/keyboard.c
index b26cee24673..64d7b139ed0 100644
--- a/src/keyboard.c
+++ b/src/keyboard.c
@@ -7141,9 +7141,6 @@ struct user_signal_info
7141/* List of user signals. */ 7141/* List of user signals. */
7142static struct user_signal_info *user_signals = NULL; 7142static struct user_signal_info *user_signals = NULL;
7143 7143
7144/* Function called when handling user signals. */
7145void (*handle_user_signal_hook) (int);
7146
7147void 7144void
7148add_user_signal (int sig, const char *name) 7145add_user_signal (int sig, const char *name)
7149{ 7146{
@@ -7192,8 +7189,6 @@ handle_user_signal (int sig)
7192 } 7189 }
7193 7190
7194 p->npending++; 7191 p->npending++;
7195 if (handle_user_signal_hook)
7196 (*handle_user_signal_hook) (sig);
7197#ifdef USABLE_SIGIO 7192#ifdef USABLE_SIGIO
7198 if (interrupt_input) 7193 if (interrupt_input)
7199 handle_input_available_signal (sig); 7194 handle_input_available_signal (sig);
diff --git a/src/keyboard.h b/src/keyboard.h
index 55667bfb17c..7f95f11bc10 100644
--- a/src/keyboard.h
+++ b/src/keyboard.h
@@ -415,8 +415,6 @@ extern void unuse_menu_items (void);
415#define EVENT_HEAD_KIND(event_head) \ 415#define EVENT_HEAD_KIND(event_head) \
416 (Fget ((event_head), Qevent_kind)) 416 (Fget ((event_head), Qevent_kind))
417 417
418extern void (*handle_user_signal_hook) (int);
419
420/* True while doing kbd input. */ 418/* True while doing kbd input. */
421extern bool waiting_for_input; 419extern bool waiting_for_input;
422 420
diff --git a/src/lisp.h b/src/lisp.h
index 6be2104ef9e..82cbca8e6ba 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -3590,6 +3590,7 @@ extern void parse_str_as_multibyte (const unsigned char *, ptrdiff_t,
3590 ptrdiff_t *, ptrdiff_t *); 3590 ptrdiff_t *, ptrdiff_t *);
3591 3591
3592/* Defined in alloc.c. */ 3592/* Defined in alloc.c. */
3593extern void *my_heap_start (void);
3593extern void check_pure_size (void); 3594extern void check_pure_size (void);
3594extern void free_misc (Lisp_Object); 3595extern void free_misc (Lisp_Object);
3595extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT); 3596extern void allocate_string_data (struct Lisp_String *, EMACS_INT, EMACS_INT);
@@ -3601,6 +3602,13 @@ extern void mark_object (Lisp_Object);
3601#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC 3602#if defined REL_ALLOC && !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
3602extern void refill_memory_reserve (void); 3603extern void refill_memory_reserve (void);
3603#endif 3604#endif
3605#ifdef DOUG_LEA_MALLOC
3606extern void alloc_unexec_pre (void);
3607extern void alloc_unexec_post (void);
3608#else
3609INLINE void alloc_unexec_pre (void) {}
3610INLINE void alloc_unexec_post (void) {}
3611#endif
3604extern const char *pending_malloc_warning; 3612extern const char *pending_malloc_warning;
3605extern Lisp_Object zero_vector; 3613extern Lisp_Object zero_vector;
3606extern Lisp_Object *stack_base; 3614extern Lisp_Object *stack_base;