summaryrefslogtreecommitdiff
path: root/src/thread.h
diff options
context:
space:
mode:
authorPaul Eggert <eggert@cs.ucla.edu>2017-07-14 04:54:05 -0700
committerPaul Eggert <eggert@cs.ucla.edu>2017-07-14 04:57:18 -0700
commit9dee1c884eb50ba282eb9dd2495c5269add25963 (patch)
tree947b4c3c21e4bef82795cfbd60f29e371b0e2cc3 /src/thread.h
parent6443a95ad74d54b8be5ba85af9b893f3f1d5fa02 (diff)
downloademacs-9dee1c884eb50ba282eb9dd2495c5269add25963.tar.gz
Improve stack-overflow heuristic on GNU/Linux
Problem reported by Steve Kemp (Bug#27585). * src/eval.c (near_C_stack_top): Remove. All uses replaced by current_thread->stack_top. (record_in_backtrace): Set current_thread->stack_top. This is for when the Lisp interpreter calls itself. * src/lread.c (read1): Set current_thread->stack_top. This is for recursive s-expression reads. * src/print.c (print_object): Set current_thread->stack_top. This is for recursive s-expression printing. * src/thread.c (mark_one_thread): Get stack top first. * src/thread.h (struct thread_state.stack_top): Now void *, not char *.
Diffstat (limited to 'src/thread.h')
-rw-r--r--src/thread.h10
1 files changed, 8 insertions, 2 deletions
diff --git a/src/thread.h b/src/thread.h
index 9e94de5c175..52b16f1ba83 100644
--- a/src/thread.h
+++ b/src/thread.h
@@ -62,8 +62,14 @@ struct thread_state
char *m_stack_bottom;
#define stack_bottom (current_thread->m_stack_bottom)
- /* An address near the top of the stack. */
- char *stack_top;
+ /* The address of an object near the C stack top, used to determine
+ which words need to be scanned by the garbage collector. This is
+ also used to detect heuristically whether segmentation violation
+ address indicates stack overflow, as opposed to some internal
+ error in Emacs. If the C function F calls G which calls H which
+ calls ... F, then at least one of the functions in the chain
+ should set this to the address of a local variable. */
+ void *stack_top;
struct catchtag *m_catchlist;
#define catchlist (current_thread->m_catchlist)