summaryrefslogtreecommitdiff
path: root/test/src/thread-tests.el
diff options
context:
space:
mode:
authorMichael Albinus <michael.albinus@gmx.de>2018-08-30 21:29:04 +0200
committerMichael Albinus <michael.albinus@gmx.de>2018-08-30 21:29:04 +0200
commit54b92132e1ec16565d59d6d9f8ff8910f38843b2 (patch)
tree894a20a1c835c5da28d0b74a26667efed5aac189 /test/src/thread-tests.el
parent3cc42bb60099c32f64e57d2ee33c8321adba7942 (diff)
downloademacs-54b92132e1ec16565d59d6d9f8ff8910f38843b2.tar.gz
emacs-54b92132e1ec16565d59d6d9f8ff8910f38843b2.tar.bz2
emacs-54b92132e1ec16565d59d6d9f8ff8910f38843b2.zip
Handle thread-signal towards the main thread (Bug#32502)
* doc/lispref/threads.texi (Basic Thread Functions): * etc/NEWS: Document thread-signal towards the main thread. * lisp/emacs-lisp/thread.el: New package. * src/keyboard.c (read_char): Check for Qthread_event. (kbd_buffer_get_event, make_lispy_event): Handle THREAD_EVENT. (syms_of_keyboard): Declare Qthread_event. (keys_of_keyboard): Add thread-handle-event to special-event-map. * src/termhooks.h (enum event_kind): Add THREAD_EVENT. * src/thread.c: Include "keyboard.h". (poll_suppress_count) Don't declare extern. (Fthread_signal): Raise event if THREAD is the main thread. (Bug#32502) * test/src/thread-tests.el (thread): Require it. (threads-signal-main-thread): New test.
Diffstat (limited to 'test/src/thread-tests.el')
-rw-r--r--test/src/thread-tests.el21
1 files changed, 21 insertions, 0 deletions
diff --git a/test/src/thread-tests.el b/test/src/thread-tests.el
index 364f6d61f05..cc1dff8a281 100644
--- a/test/src/thread-tests.el
+++ b/test/src/thread-tests.el
@@ -19,6 +19,8 @@
;;; Code:
+(require 'thread)
+
;; Declare the functions in case Emacs has been configured --without-threads.
(declare-function all-threads "thread.c" ())
(declare-function condition-mutex "thread.c" (cond))
@@ -320,6 +322,25 @@
(should-not (thread-alive-p thread))
(should (equal (thread-last-error) '(error)))))
+(ert-deftest threads-signal-main-thread ()
+ "Test signaling the main thread."
+ (skip-unless (featurep 'threads))
+ ;; We cannot use `ert-with-message-capture', because threads do not
+ ;; know let-bound variables.
+ (with-current-buffer "*Messages*"
+ (let (buffer-read-only)
+ (erase-buffer))
+ (let ((thread
+ (make-thread #'(lambda () (thread-signal main-thread 'error nil)))))
+ (while (thread-alive-p thread)
+ (thread-yield))
+ (read-event nil nil 0.1)
+ ;; No error has been raised, which is part of the test.
+ (should
+ (string-match
+ (format-message "Error %s: (error nil)" thread)
+ (buffer-string ))))))
+
(defvar threads-condvar nil)
(defun threads-test-condvar-wait ()