Add a unit test testing interaction between threads and processes.

This unit test tests that we can call 'accept-process-output' in
parallel from multiple threads.

* test/src/process-tests.el (process-tests/multiple-threads-waiting):
New unit test.
This commit is contained in:
Philipp Stephani 2021-01-23 19:10:22 +01:00
parent 17fec60370
commit 8dcb19fc5e

View file

@ -789,6 +789,35 @@ have written output."
(should (equal calls
(list (list process "finished\n"))))))))))
(ert-deftest process-tests/multiple-threads-waiting ()
(skip-unless (fboundp 'make-thread))
(with-timeout (60 (ert-fail "Test timed out"))
(process-tests--with-processes processes
(let ((threads ())
(cat (executable-find "cat")))
(skip-unless cat)
(dotimes (i 10)
(let* ((name (format "test %d" i))
(process (make-process :name name
:command (list cat)
:coding 'no-conversion
:noquery t
:connection-type 'pipe)))
(push process processes)
(set-process-thread process nil)
(push (make-thread
(lambda ()
(while (accept-process-output process)))
name)
threads)))
(mapc #'process-send-eof processes)
(cl-loop for process in processes
and thread in threads
do
(thread-join thread)
(should (eq (process-status process) 'exit))
(should (eql (process-exit-status process) 0)))))))
(defun process-tests--eval (command form)
"Return a command that evaluates FORM in an Emacs subprocess.
COMMAND must be a list returned by