aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorEli Zaretskii2018-10-17 18:19:47 +0300
committerEli Zaretskii2018-10-17 18:19:47 +0300
commit73567432329a245b2eb02e4c61adea2c8eab6b3a (patch)
tree2dbdfc862dc4b4dbea44b2f613720c50915406cc
parent134ba45bf0c11048c44a46c11d5dc8da12ca4d3e (diff)
downloademacs-73567432329a245b2eb02e4c61adea2c8eab6b3a.tar.gz
emacs-73567432329a245b2eb02e4c61adea2c8eab6b3a.zip
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 3b150797c36..0e48b33882c 100644
--- a/src/alloc.c
+++ b/src/alloc.c
@@ -5863,6 +5863,8 @@ garbage_collect_1 (void *end)
5863 VECTOR_UNMARK (&buffer_defaults); 5863 VECTOR_UNMARK (&buffer_defaults);
5864 VECTOR_UNMARK (&buffer_local_symbols); 5864 VECTOR_UNMARK (&buffer_local_symbols);
5865 5865
5866 unmark_main_thread ();
5867
5866 check_cons_list (); 5868 check_cons_list ();
5867 5869
5868 gc_in_progress = 0; 5870 gc_in_progress = 0;
diff --git a/src/lisp.h b/src/lisp.h
index a7a26ef350e..145901dff5e 100644
--- a/src/lisp.h
+++ b/src/lisp.h
@@ -4011,6 +4011,7 @@ extern void syms_of_module (void);
4011 4011
4012/* Defined in thread.c. */ 4012/* Defined in thread.c. */
4013extern void mark_threads (void); 4013extern void mark_threads (void);
4014extern void unmark_main_thread (void);
4014 4015
4015/* Defined in editfns.c. */ 4016/* Defined in editfns.c. */
4016extern void insert1 (Lisp_Object); 4017extern void insert1 (Lisp_Object);
diff --git a/src/thread.c b/src/thread.c
index fc933440fcc..3674af0e47b 100644
--- a/src/thread.c
+++ b/src/thread.c
@@ -656,6 +656,12 @@ mark_threads (void)
656 flush_stack_call_func (mark_threads_callback, NULL); 656 flush_stack_call_func (mark_threads_callback, NULL);
657} 657}
658 658
659void
660unmark_main_thread (void)
661{
662 main_thread.header.size &= ~ARRAY_MARK_FLAG;
663}
664
659 665
660 666
661static void 667static void
diff --git a/test/src/thread-tests.el b/test/src/thread-tests.el
index 109e71128ab..36bb6377901 100644
--- a/test/src/thread-tests.el
+++ b/test/src/thread-tests.el
@@ -388,4 +388,8 @@
388 (should (= (length (all-threads)) 1)) 388 (should (= (length (all-threads)) 1))
389 (should (equal (thread-last-error) '(error "Die, die, die!"))))) 389 (should (equal (thread-last-error) '(error "Die, die, die!")))))
390 390
391(ert-deftest threads-test-bug33073 ()
392 (let ((th (make-thread 'ignore)))
393 (should-not (equal th main-thread))))
394
391;;; threads.el ends here 395;;; threads.el ends here