aboutsummaryrefslogtreecommitdiffstats
path: root/src/alloc.c
diff options
context:
space:
mode:
authorKen Brown2014-08-28 10:48:02 -0400
committerKen Brown2014-08-28 10:48:02 -0400
commitea652500776aacbb8cb64f9ecca16a2d2c7add80 (patch)
treec759fc62dfa422e8fb636aef6dbb04df2c68cc7e /src/alloc.c
parenta7ef7a0e53ae1f391f4bda207bb5e9b9d833d354 (diff)
downloademacs-ea652500776aacbb8cb64f9ecca16a2d2c7add80.tar.gz
emacs-ea652500776aacbb8cb64f9ecca16a2d2c7add80.zip
Add support for HYBRID_MALLOC, allowing the use of gmalloc before
dumping and the system malloc after dumping. (Bug#18222) * configure.ac (HYBRID_MALLOC): New macro; define to use gmalloc before dumping and the system malloc after dumping. Define on Cygwin. * src/conf_post.h (malloc, realloc, calloc, free) [HYBRID_MALLOC]: Define as macros, expanding to hybrid_malloc, etc. (HYBRID_GET_CURRENT_DIR_NAME): New macro. (get_current_dir_name) [HYBRID_GET_CURRENT_DIR_NAME]: Define as macro. * src/gmalloc.c: Set up the infrastructure for HYBRID_MALLOC, with a full implementation on Cygwin. Remove Cygwin-specific code that is no longer needed. (malloc, realloc, calloc, free, aligned_alloc) [HYBRID_MALLOC]: Redefine as macros expanding to gmalloc, grealloc, etc. (DUMPED, ALLOCATED_BEFORE_DUMPING) [CYGWIN]: New macros. (get_current_dir_name) [HYBRID_GET_CURRENT_DIR_NAME]: Undefine. (USE_PTHREAD, posix_memalign) [HYBRID_MALLOC]: Don't define. (hybrid_malloc, hybrid_calloc, hybrid_free, hybrid_realloc) [HYBRID_MALLOC]: (hybrid_get_current_dir_name) [HYBRID_GET_CURRENT_DIR_NAME]: (hybrid_aligned_alloc) [HYBRID_MALLOC && (HAVE_ALIGNED_ALLOC || HAVE_POSIX_MEMALIGN)]: New functions. * src/alloc.c (aligned_alloc) [HYBRID_MALLOC && (ALIGNED_ALLOC || HAVE_POSIX_MEMALIGN)]: Define as macro expanding to hybrid_aligned_alloc; declare. (USE_ALIGNED_ALLOC) [HYBRID_MALLOC && (ALIGNED_ALLOC || HAVE_POSIX_MEMALIGN)]: Define. (refill_memory_reserve) [HYBRID_MALLOC]: Do nothing. * src/sysdep.c (get_current_dir_name) [HYBRID_GET_CURRENT_DIR_NAME]: Define as macro, expanding to gget_current_dir_name, and define the latter. * src/emacs.c (main) [HYBRID_MALLOC]: Don't call memory_warnings() or malloc_enable_thread(). Don't initialize malloc. * src/lisp.h (NONPOINTER_BITS) [CYGWIN]: Define (because GNU_MALLOC is no longer defined on Cygwin). (refill_memory_reserve) [HYBRID_MALLOC]: Don't declare. * src/sheap.c (bss_sbrk_buffer_end): New variable. * src/unexcw.c (__malloc_initialized): Remove variable. * src/ralloc.c: Throughout, treat HYBRID_MALLOC the same as SYSTEM_MALLOC. * src/xdisp.c (decode_mode_spec) [HYBRID_MALLOC]: Don't check Vmemory_full.
Diffstat (limited to 'src/alloc.c')
-rw-r--r--src/alloc.c15
1 files changed, 11 insertions, 4 deletions
diff --git a/src/alloc.c b/src/alloc.c
index ac154b587e6..9c81ae2eedf 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -80,7 +80,7 @@ static bool valgrind_p;
80 marked objects. */ 80 marked objects. */
81 81
82#if (defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC \ 82#if (defined SYSTEM_MALLOC || defined DOUG_LEA_MALLOC \
83 || defined GC_CHECK_MARKED_OBJECTS) 83 || defined HYBRID_MALLOC || defined GC_CHECK_MARKED_OBJECTS)
84#undef GC_MALLOC_CHECK 84#undef GC_MALLOC_CHECK
85#endif 85#endif
86 86
@@ -285,7 +285,7 @@ static void gc_sweep (void);
285static Lisp_Object make_pure_vector (ptrdiff_t); 285static Lisp_Object make_pure_vector (ptrdiff_t);
286static void mark_buffer (struct buffer *); 286static void mark_buffer (struct buffer *);
287 287
288#if !defined REL_ALLOC || defined SYSTEM_MALLOC 288#if !defined REL_ALLOC || defined SYSTEM_MALLOC || defined HYBRID_MALLOC
289static void refill_memory_reserve (void); 289static void refill_memory_reserve (void);
290#endif 290#endif
291static void compact_small_strings (void); 291static void compact_small_strings (void);
@@ -1014,10 +1014,17 @@ lisp_free (void *block)
1014 clang 3.3 anyway. */ 1014 clang 3.3 anyway. */
1015 1015
1016#if ! ADDRESS_SANITIZER 1016#if ! ADDRESS_SANITIZER
1017# if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC 1017# if !defined SYSTEM_MALLOC && !defined DOUG_LEA_MALLOC && !defined HYBRID_MALLOC
1018# define USE_ALIGNED_ALLOC 1 1018# define USE_ALIGNED_ALLOC 1
1019/* Defined in gmalloc.c. */ 1019/* Defined in gmalloc.c. */
1020void *aligned_alloc (size_t, size_t); 1020void *aligned_alloc (size_t, size_t);
1021# elif defined HYBRID_MALLOC
1022# if defined ALIGNED_ALLOC || defined HAVE_POSIX_MEMALIGN
1023# define USE_ALIGNED_ALLOC 1
1024# define aligned_alloc hybrid_aligned_alloc
1025/* Defined in gmalloc.c. */
1026void *aligned_alloc (size_t, size_t);
1027# endif
1021# elif defined HAVE_ALIGNED_ALLOC 1028# elif defined HAVE_ALIGNED_ALLOC
1022# define USE_ALIGNED_ALLOC 1 1029# define USE_ALIGNED_ALLOC 1
1023# elif defined HAVE_POSIX_MEMALIGN 1030# elif defined HAVE_POSIX_MEMALIGN
@@ -3829,7 +3836,7 @@ memory_full (size_t nbytes)
3829void 3836void
3830refill_memory_reserve (void) 3837refill_memory_reserve (void)
3831{ 3838{
3832#ifndef SYSTEM_MALLOC 3839#if !defined SYSTEM_MALLOC && !defined HYBRID_MALLOC
3833 if (spare_memory[0] == 0) 3840 if (spare_memory[0] == 0)
3834 spare_memory[0] = malloc (SPARE_MEMORY); 3841 spare_memory[0] = malloc (SPARE_MEMORY);
3835 if (spare_memory[1] == 0) 3842 if (spare_memory[1] == 0)