emacs-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Enlarge MAX_ALLOCA?


From: Eli Zaretskii
Subject: Enlarge MAX_ALLOCA?
Date: Thu, 19 Jun 2014 19:02:43 +0300

Does anyone see problems with the change below, which raises the bar
for 'alloca' to 64KB?  Are there any systems out there that we care
about whose stack is so small as to make this dangerous?

Why 64KB?  Because that's the size of the work area coding.c allocates
whenever it needs to encode or decode something.  It turns out we do
this a lot, e.g., every redisplay calls file-readable-p on the icon
image files, which needs to encode the file name.  While the work area
is immediately free'd, I think allocating such a large buffer so much
has a potential of creating an unnecessary memory pressure on 'malloc',
and perhaps cause excess fragmentation and/or enlarge memory footprint
in some cases.

Thoughts?

=== modified file 'src/lisp.h'
--- src/lisp.h  2014-06-17 16:09:19 +0000
+++ src/lisp.h  2014-06-19 15:37:17 +0000
@@ -4425,7 +4425,7 @@ extern void init_system_name (void);
 /* SAFE_ALLOCA normally allocates memory on the stack, but if size is
    larger than MAX_ALLOCA, use xmalloc to avoid overflowing the stack.  */
 
-enum MAX_ALLOCA { MAX_ALLOCA = 16 * 1024 };
+enum MAX_ALLOCA { MAX_ALLOCA = 64 * 1024 };
 
 extern void *record_xmalloc (size_t) ATTRIBUTE_ALLOC_SIZE ((1));
 
@@ -4434,7 +4434,7 @@ extern void *record_xmalloc (size_t) ATT
 
 /* SAFE_ALLOCA allocates a simple buffer.  */
 
-#define SAFE_ALLOCA(size) ((size) < MAX_ALLOCA \
+#define SAFE_ALLOCA(size) ((size) <= MAX_ALLOCA        \
                           ? alloca (size)      \
                           : (sa_must_free = true, record_xmalloc (size)))
 
@@ -4469,7 +4469,7 @@ extern void *record_xmalloc (size_t) ATT
 
 #define SAFE_ALLOCA_LISP(buf, nelt)                           \
   do {                                                        \
-    if ((nelt) < MAX_ALLOCA / word_size)                      \
+    if ((nelt) <= MAX_ALLOCA / word_size)                     \
       (buf) = alloca ((nelt) * word_size);                    \
     else if ((nelt) < min (PTRDIFF_MAX, SIZE_MAX) / word_size) \
       {                                                               \




reply via email to

[Prev in Thread] Current Thread [Next in Thread]