summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorEli Zaretskii <eliz@gnu.org>2018-10-17 18:19:47 +0300
committerAndreas Schwab <schwab@linux-m68k.org>2019-06-10 12:52:31 +0200
commitfdd1b3e02097966e7ffe8065f6e3d27f5f540d0a (patch)
tree7163eaff57ea41c4a081bd2aff38845985d9a250
parent758e9a8ed49c15f7069a67cf0c2ce3c6f9a3f7e1 (diff)
downloademacs-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.c2
-rw-r--r--src/lisp.h1
-rw-r--r--src/thread.c6
-rw-r--r--test/src/thread-tests.el4
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