From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.blaine.gmane.org!not-for-mail From: Olivier Dion via "Bug reports for GUILE, GNU's Ubiquitous Extension Language" Newsgroups: gmane.lisp.guile.bugs Subject: bug#59055: [PATCH] Fix possible deadlock. Date: Sat, 5 Nov 2022 12:59:23 -0400 Message-ID: <20221105165923.5426-1-olivier.dion@polymtl.ca> Reply-To: Olivier Dion Mime-Version: 1.0 Content-Transfer-Encoding: 8bit Injection-Info: ciao.gmane.io; posting-host="blaine.gmane.org:116.202.254.214"; logging-data="25979"; mail-complaints-to="usenet@ciao.gmane.io" Cc: Olivier Dion To: 59055@debbugs.gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane-mx.org@gnu.org Sat Nov 05 18:01:00 2022 Return-path: Envelope-to: guile-bugs@m.gmane-mx.org Original-Received: from lists.gnu.org ([209.51.188.17]) by ciao.gmane.io with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1orMXT-0006XS-7b for guile-bugs@m.gmane-mx.org; Sat, 05 Nov 2022 18:00:59 +0100 Original-Received: from localhost ([::1] helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1orMWb-00061B-SC; Sat, 05 Nov 2022 13:00:05 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orMWZ-0005yN-5b for bug-guile@gnu.org; Sat, 05 Nov 2022 13:00:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_128_GCM_SHA256:128) (Exim 4.90_1) (envelope-from ) id 1orMWY-0004vd-Si for bug-guile@gnu.org; Sat, 05 Nov 2022 13:00:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1orMWY-0006Il-Bi for bug-guile@gnu.org; Sat, 05 Nov 2022 13:00:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: Olivier Dion Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Sat, 05 Nov 2022 17:00:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 59055 X-GNU-PR-Package: guile X-GNU-PR-Keywords: patch X-Debbugs-Original-To: bug-guile@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.166766759424184 (code B ref -1); Sat, 05 Nov 2022 17:00:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 5 Nov 2022 16:59:54 +0000 Original-Received: from localhost ([127.0.0.1]:57904 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orMWQ-0006I0-3y for submit@debbugs.gnu.org; Sat, 05 Nov 2022 12:59:54 -0400 Original-Received: from lists.gnu.org ([209.51.188.17]:48268) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1orMWL-0006Hp-Ve for submit@debbugs.gnu.org; Sat, 05 Nov 2022 12:59:52 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]) by lists.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orMWL-0005tB-Ie for bug-guile@gnu.org; Sat, 05 Nov 2022 12:59:49 -0400 Original-Received: from smtp.polymtl.ca ([132.207.4.11]) by eggs.gnu.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.90_1) (envelope-from ) id 1orMWJ-0004tp-S9 for bug-guile@gnu.org; Sat, 05 Nov 2022 12:59:49 -0400 Original-Received: from laura.ht.home (modemcable094.169-200-24.mc.videotron.ca [24.200.169.94]) (authenticated bits=0) by smtp.polymtl.ca (8.14.7/8.14.7) with ESMTP id 2A5GxXiZ016363 (version=TLSv1/SSLv3 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128 verify=NOT); Sat, 5 Nov 2022 12:59:40 -0400 DKIM-Filter: OpenDKIM Filter v2.11.0 smtp.polymtl.ca 2A5GxXiZ016363 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=polymtl.ca; s=default; t=1667667580; bh=w4tLj5O8/XRYj8g0dRJLHaRrmfXSg/ED/Ww5QurgW/Q=; h=From:To:Cc:Subject:Date:From; b=uRWF40KMtrhFGd6PUfNYIP7kARgTo2aCNT6YfnKNtOlW7Ivpuq30WkfGQKQmcgvwv Z8guAm5c84P2pFQwhdRu2qXra8Wg+QgSlTtzG/S5NZAY/JYP+A1tAZpR6k5pk0gY7h zaFd7qCIODdTxG6ZIvDlPLxOPJfq9mCPhX8P6UEA= X-Mailer: git-send-email 2.38.0 X-Poly-FromMTA: (modemcable094.169-200-24.mc.videotron.ca [24.200.169.94]) at Sat, 5 Nov 2022 16:59:33 +0000 Received-SPF: pass client-ip=132.207.4.11; envelope-from=olivier.dion@polymtl.ca; helo=smtp.polymtl.ca X-Spam_score_int: -43 X-Spam_score: -4.4 X-Spam_bar: ---- X-Spam_report: (-4.4 / 5.0 requ) BAYES_00=-1.9, DKIM_SIGNED=0.1, DKIM_VALID=-0.1, DKIM_VALID_AU=-0.1, DKIM_VALID_EF=-0.1, RCVD_IN_DNSWL_MED=-2.3, RCVD_IN_MSPIKE_H3=0.001, RCVD_IN_MSPIKE_WL=0.001, SPF_HELO_PASS=-0.001, SPF_PASS=-0.001 autolearn=ham autolearn_force=no X-Spam_action: no action X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list X-BeenThere: bug-guile@gnu.org List-Id: "Bug reports for GUILE, GNU's Ubiquitous Extension Language" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: "bug-guile" Errors-To: bug-guile-bounces+guile-bugs=m.gmane-mx.org@gnu.org Xref: news.gmane.io gmane.lisp.guile.bugs:10411 Archived-At: If we got interrupted while waiting on our condition variable, we unlock the kernel mutex momentarily while executing asynchronous operations before putting us back into the waiting queue. However, we have to retry acquiring the mutex before getting back into the queue, otherwise it's possible that we wait indefinitely since nobody could be the owner for a while. * libguile/threads.c (lock_mutex): Try acquring the mutex after signal interruption. --- libguile/threads.c | 19 ++++++++++--------- 1 file changed, 10 insertions(+), 9 deletions(-) diff --git a/libguile/threads.c b/libguile/threads.c index 280d306bf..0f5cf2ed5 100644 --- a/libguile/threads.c +++ b/libguile/threads.c @@ -1022,14 +1022,7 @@ lock_mutex (enum scm_mutex_kind kind, struct scm_mutex *m, if (err == 0) { - if (scm_is_eq (m->owner, SCM_BOOL_F)) - { - m->owner = current_thread->handle; - scm_i_pthread_mutex_unlock (&m->lock); - return SCM_BOOL_T; - } - else - continue; + goto maybe_acquire; } else if (err == ETIMEDOUT) { @@ -1041,7 +1034,7 @@ lock_mutex (enum scm_mutex_kind kind, struct scm_mutex *m, scm_i_pthread_mutex_unlock (&m->lock); scm_async_tick (); scm_i_scm_pthread_mutex_lock (&m->lock); - continue; + goto maybe_acquire; } else { @@ -1050,6 +1043,14 @@ lock_mutex (enum scm_mutex_kind kind, struct scm_mutex *m, errno = err; SCM_SYSERROR; } + + maybe_acquire: + if (scm_is_eq (m->owner, SCM_BOOL_F)) + { + m->owner = current_thread->handle; + scm_i_pthread_mutex_unlock (&m->lock); + return SCM_BOOL_T; + } } } #undef FUNC_NAME -- 2.38.0