Commit d1658221 authored by Richard M. Stallman's avatar Richard M. Stallman
Browse files

For glibc's malloc, include <malloc.h> for mallinfo,

mallopt, struct mallinfo, and mallopt constants.
(BYTES_USED): New macro.
(memory_full, emacs_blocked_free): Replace _bytes_used with BYTES_USED.
(emacs_blocked_malloc): Set sbrk padding value for glibc, as is
done with gmalloc.
(allocate_vectorlike, make_uninit_string):
Prevent using mmap for possible large chunks.
(init_alloc_once): Set trim and mmap malloc parms, when using glibc.
parent b05a95cb
...@@ -37,6 +37,10 @@ Boston, MA 02111-1307, USA. */ ...@@ -37,6 +37,10 @@ Boston, MA 02111-1307, USA. */
extern char *sbrk (); extern char *sbrk ();
#ifdef DOUG_LEA_MALLOC
#include <malloc.h>
#define __malloc_size_t int
#else
/* The following come from gmalloc.c. */ /* The following come from gmalloc.c. */
#if defined (__STDC__) && __STDC__ #if defined (__STDC__) && __STDC__
...@@ -47,6 +51,7 @@ extern char *sbrk (); ...@@ -47,6 +51,7 @@ extern char *sbrk ();
#endif #endif
extern __malloc_size_t _bytes_used; extern __malloc_size_t _bytes_used;
extern int __malloc_extra_blocks; extern int __malloc_extra_blocks;
#endif /* !defined(DOUG_LEA_MALLOC) */
extern Lisp_Object Vhistory_length; extern Lisp_Object Vhistory_length;
...@@ -208,12 +213,18 @@ display_malloc_warning () ...@@ -208,12 +213,18 @@ display_malloc_warning ()
internal_with_output_to_temp_buffer (" *Danger*", malloc_warning_1, val); internal_with_output_to_temp_buffer (" *Danger*", malloc_warning_1, val);
} }
#ifdef DOUG_LEA_MALLOC
#define BYTES_USED (mallinfo ().arena)
#else
#define BYTES_USED _bytes_used
#endif
/* Called if malloc returns zero */ /* Called if malloc returns zero */
memory_full () memory_full ()
{ {
#ifndef SYSTEM_MALLOC #ifndef SYSTEM_MALLOC
bytes_used_when_full = _bytes_used; bytes_used_when_full = BYTES_USED;
#endif #endif
/* The first time we get here, free the spare memory. */ /* The first time we get here, free the spare memory. */
...@@ -333,7 +344,7 @@ emacs_blocked_free (ptr) ...@@ -333,7 +344,7 @@ emacs_blocked_free (ptr)
The code here is correct as long as SPARE_MEMORY The code here is correct as long as SPARE_MEMORY
is substantially larger than the block size malloc uses. */ is substantially larger than the block size malloc uses. */
&& (bytes_used_when_full && (bytes_used_when_full
> _bytes_used + max (malloc_hysteresis, 4) * SPARE_MEMORY)) > BYTES_USED + max (malloc_hysteresis, 4) * SPARE_MEMORY))
spare_memory = (char *) malloc (SPARE_MEMORY); spare_memory = (char *) malloc (SPARE_MEMORY);
__free_hook = emacs_blocked_free; __free_hook = emacs_blocked_free;
...@@ -363,7 +374,11 @@ emacs_blocked_malloc (size) ...@@ -363,7 +374,11 @@ emacs_blocked_malloc (size)
BLOCK_INPUT; BLOCK_INPUT;
__malloc_hook = old_malloc_hook; __malloc_hook = old_malloc_hook;
#ifdef DOUG_LEA_MALLOC
mallopt (M_TOP_PAD, malloc_hysteresis * 4096);
#else
__malloc_extra_blocks = malloc_hysteresis; __malloc_extra_blocks = malloc_hysteresis;
#endif
value = (void *) malloc (size); value = (void *) malloc (size);
__malloc_hook = emacs_blocked_malloc; __malloc_hook = emacs_blocked_malloc;
UNBLOCK_INPUT; UNBLOCK_INPUT;
...@@ -731,8 +746,16 @@ allocate_vectorlike (len) ...@@ -731,8 +746,16 @@ allocate_vectorlike (len)
struct Lisp_Vector *p; struct Lisp_Vector *p;
allocating_for_lisp = 1; allocating_for_lisp = 1;
#ifdef DOUG_LEA_MALLOC
/* Prevent mmap'ing the chunk (which is potentially very large). */
mallopt (M_MMAP_MAX, 0);
#endif
p = (struct Lisp_Vector *)xmalloc (sizeof (struct Lisp_Vector) p = (struct Lisp_Vector *)xmalloc (sizeof (struct Lisp_Vector)
+ (len - 1) * sizeof (Lisp_Object)); + (len - 1) * sizeof (Lisp_Object));
#ifdef DOUG_LEA_MALLOC
/* Back to a reasonable maximum of mmap'ed areas. */
mallopt (M_MMAP_MAX, 64);
#endif
allocating_for_lisp = 0; allocating_for_lisp = 0;
VALIDATE_LISP_STORAGE (p, 0); VALIDATE_LISP_STORAGE (p, 0);
consing_since_gc += (sizeof (struct Lisp_Vector) consing_since_gc += (sizeof (struct Lisp_Vector)
...@@ -1180,7 +1203,15 @@ make_uninit_string (length) ...@@ -1180,7 +1203,15 @@ make_uninit_string (length)
{ {
register struct string_block *new; register struct string_block *new;
allocating_for_lisp = 1; allocating_for_lisp = 1;
#ifdef DOUG_LEA_MALLOC
/* Prevent mmap'ing the chunk (which is potentially very large). */
mallopt (M_MMAP_MAX, 0);
#endif
new = (struct string_block *) xmalloc (sizeof (struct string_block_head) + fullsize); new = (struct string_block *) xmalloc (sizeof (struct string_block_head) + fullsize);
#ifdef DOUG_LEA_MALLOC
/* Back to a reasonable maximum of mmap'ed areas. */
mallopt (M_MMAP_MAX, 64);
#endif
allocating_for_lisp = 0; allocating_for_lisp = 0;
VALIDATE_LISP_STORAGE (new, 0); VALIDATE_LISP_STORAGE (new, 0);
consing_since_gc += sizeof (struct string_block_head) + fullsize; consing_since_gc += sizeof (struct string_block_head) + fullsize;
...@@ -2579,6 +2610,11 @@ init_alloc_once () ...@@ -2579,6 +2610,11 @@ init_alloc_once ()
#endif #endif
all_vectors = 0; all_vectors = 0;
ignore_warnings = 1; ignore_warnings = 1;
#ifdef DOUG_LEA_MALLOC
mallopt (M_TRIM_THRESHOLD, 128*1024); /* trim threshold */
mallopt (M_MMAP_THRESHOLD, 64*1024); /* mmap threshold */
mallopt (M_MMAP_MAX, 64); /* max. number of mmap'ed areas */
#endif
init_strings (); init_strings ();
init_cons (); init_cons ();
init_symbol (); init_symbol ();
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment