civodul pushed a commit to branch main in repository guile. commit dcccaddf7bceb3eef00d036b666b9510682009d4 Author: Timothy Sample <samp...@ngyro.com> AuthorDate: Tue Apr 11 10:22:46 2023 -0600
Avoid module resolution in 'call-with-new-thread'. Fixes <https://bugs.gnu.org/62691>. Reported by Михаил Бахтерев <mike.bakhte...@gmail.com>. * module/ice-9/threads.scm (call-with-new-thread): Do not use 'set!' to set object properties while the calling thread is waiting on the new thread to initialize. Signed-off-by: Ludovic Courtès <l...@gnu.org> --- NEWS | 2 ++ module/ice-9/threads.scm | 10 +++++++++- 2 files changed, 11 insertions(+), 1 deletion(-) diff --git a/NEWS b/NEWS index 81f19744a..239edca83 100644 --- a/NEWS +++ b/NEWS @@ -33,6 +33,8 @@ the compiler reports it as "possibly unused". (<https://bugs.gnu.org/63024>) ** Fix possible deadlock in 'sigaction' (aka. 'scm_sigaction_for_thread') (<https://bugs.gnu.org/64666>) +** Avoid module resolution in 'call-with-new-thread', which could deadlock + (<https://bugs.gnu.org/62691>) ** Hashing of UTF-8 symbols with non-ASCII characters avoids corruption (<https://bugs.gnu.org/56413>) diff --git a/module/ice-9/threads.scm b/module/ice-9/threads.scm index 5a13cec1d..048d8b085 100644 --- a/module/ice-9/threads.scm +++ b/module/ice-9/threads.scm @@ -151,7 +151,15 @@ Once @var{thunk} or @var{handler} returns, the return value is made the (lambda () (lock-mutex mutex) (set! thread (current-thread)) - (set! (thread-join-data thread) (cons cv mutex)) + ;; Rather than use the 'set!' syntax here, we use the + ;; underlying 'setter' generic function to set the + ;; 'thread-join-data' property on 'thread'. This is + ;; because 'set!' will try to resolve 'setter' in the + ;; '(guile)' module, which means acquiring the + ;; 'autoload' mutex. If the calling thread is + ;; already holding that mutex, this will result in + ;; deadlock. See <https://bugs.gnu.org/62691>. + ((setter thread-join-data) thread (cons cv mutex)) (signal-condition-variable cv) (unlock-mutex mutex) (call-with-unblocked-asyncs