diff options
| author | Paul Eggert | 2017-07-14 04:54:05 -0700 |
|---|---|---|
| committer | Paul Eggert | 2017-07-14 04:57:18 -0700 |
| commit | 9dee1c884eb50ba282eb9dd2495c5269add25963 (patch) | |
| tree | 947b4c3c21e4bef82795cfbd60f29e371b0e2cc3 /src/thread.h | |
| parent | 6443a95ad74d54b8be5ba85af9b893f3f1d5fa02 (diff) | |
| download | emacs-9dee1c884eb50ba282eb9dd2495c5269add25963.tar.gz emacs-9dee1c884eb50ba282eb9dd2495c5269add25963.zip | |
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.h | 10 |
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 | |||
| 62 | char *m_stack_bottom; | 62 | char *m_stack_bottom; |
| 63 | #define stack_bottom (current_thread->m_stack_bottom) | 63 | #define stack_bottom (current_thread->m_stack_bottom) |
| 64 | 64 | ||
| 65 | /* An address near the top of the stack. */ | 65 | /* The address of an object near the C stack top, used to determine |
| 66 | char *stack_top; | 66 | which words need to be scanned by the garbage collector. This is |
| 67 | also used to detect heuristically whether segmentation violation | ||
| 68 | address indicates stack overflow, as opposed to some internal | ||
| 69 | error in Emacs. If the C function F calls G which calls H which | ||
| 70 | calls ... F, then at least one of the functions in the chain | ||
| 71 | should set this to the address of a local variable. */ | ||
| 72 | void *stack_top; | ||
| 67 | 73 | ||
| 68 | struct catchtag *m_catchlist; | 74 | struct catchtag *m_catchlist; |
| 69 | #define catchlist (current_thread->m_catchlist) | 75 | #define catchlist (current_thread->m_catchlist) |