;; -*- lexical-binding:t -*- (defun wait-forever (filename) (unwind-protect (condition-case e (let* ((mutex (make-mutex)) (cvar (make-condition-variable mutex))) (with-mutex mutex (write-region "WAITING" nil filename nil 0) (while t (condition-wait cvar)))) (quit (write-region "QUIT" nil filename nil 0))) (kill-emacs))) (defun spawn-child-then-wait (filename) (make-thread (lambda () (write-region " TERMINATING2" nil filename t 0))) (unwind-protect (condition-case e (let* ((mutex (make-mutex)) (cvar (make-condition-variable mutex))) (with-mutex mutex (write-region "WAITING1" nil filename nil 0) (while t (condition-wait cvar)))) (quit (write-region "QUIT1" nil filename nil 0))) (kill-emacs))) (defun two-threads-waiting (filename) (make-thread (lambda () (unwind-protect (condition-case e (let* ((mutex (make-mutex)) (cvar (make-condition-variable mutex))) (with-mutex mutex (write-region " WAITING2" nil filename t 0) (while t (condition-wait cvar)))) (quit (write-region "QUIT2" nil filename nil 0))) (kill-emacs)))) (unwind-protect (condition-case e (let* ((mutex (make-mutex)) (cvar (make-condition-variable mutex))) (with-mutex mutex (write-region "WAITING1" nil filename nil 0) (while t (condition-wait cvar)))) (quit (write-region " QUIT1" nil filename t 0))) (kill-emacs)))