diff options
author | Eli Zaretskii <eliz@gnu.org> | 2018-10-17 18:19:47 +0300 |
---|---|---|
committer | Andreas Schwab <schwab@linux-m68k.org> | 2019-06-10 12:52:31 +0200 |
commit | fdd1b3e02097966e7ffe8065f6e3d27f5f540d0a (patch) | |
tree | 7163eaff57ea41c4a081bd2aff38845985d9a250 | |
parent | 758e9a8ed49c15f7069a67cf0c2ce3c6f9a3f7e1 (diff) | |
download | emacs-fdd1b3e02097966e7ffe8065f6e3d27f5f540d0a.tar.gz |
Avoid assertion violation when comparing with main-thread
* src/thread.c (unmark_main_thread): New function.
* src/lisp.h (unmark_main_thread): Prototype it.
* src/alloc.c (garbage_collect_1): Call it after sweeping.
(Bug#33073)
* test/src/thread-tests.el (threads-test-bug33073): New test.
-rw-r--r-- | src/alloc.c | 2 | ||||
-rw-r--r-- | src/lisp.h | 1 | ||||
-rw-r--r-- | src/thread.c | 6 | ||||
-rw-r--r-- | test/src/thread-tests.el | 4 |
4 files changed, 13 insertions, 0 deletions
diff --git a/src/alloc.c b/src/alloc.c index 6aeac140ca0..1a72941cc92 100644 --- a/src/alloc.c +++ b/src/alloc.c @@ -6003,6 +6003,8 @@ garbage_collect_1 (void *end) VECTOR_UNMARK (&buffer_defaults); VECTOR_UNMARK (&buffer_local_symbols); + unmark_main_thread (); + check_cons_list (); gc_in_progress = 0; diff --git a/src/lisp.h b/src/lisp.h index 782c396dbb4..24551699328 100644 --- a/src/lisp.h +++ b/src/lisp.h @@ -3975,6 +3975,7 @@ extern void syms_of_module (void); /* Defined in thread.c. */ extern void mark_threads (void); +extern void unmark_main_thread (void); /* Defined in editfns.c. */ extern void insert1 (Lisp_Object); diff --git a/src/thread.c b/src/thread.c index 0cd1ae33dc2..47f55e7f67c 100644 --- a/src/thread.c +++ b/src/thread.c @@ -656,6 +656,12 @@ mark_threads (void) flush_stack_call_func (mark_threads_callback, NULL); } +void +unmark_main_thread (void) +{ + main_thread.header.size &= ~ARRAY_MARK_FLAG; +} + static void diff --git a/test/src/thread-tests.el b/test/src/thread-tests.el index e8d66b87db3..b57b4f9412d 100644 --- a/test/src/thread-tests.el +++ b/test/src/thread-tests.el @@ -347,4 +347,8 @@ (should (= (length (all-threads)) 1)) (should (equal (thread-last-error) '(error "Die, die, die!"))))) +(ert-deftest threads-test-bug33073 () + (let ((th (make-thread 'ignore))) + (should-not (equal th main-thread)))) + ;;; threads.el ends here |