From unknown Sat Jun 14 00:06:17 2025 Content-Disposition: inline Content-Transfer-Encoding: quoted-printable MIME-Version: 1.0 X-Mailer: MIME-tools 5.509 (Entity 5.509) Content-Type: text/plain; charset=utf-8 From: bug#40681 <40681@debbugs.gnu.org> To: bug#40681 <40681@debbugs.gnu.org> Subject: Status: srfi-18 mutex-unlock! breaks mutex on timeout Reply-To: bug#40681 <40681@debbugs.gnu.org> Date: Sat, 14 Jun 2025 07:06:17 +0000 retitle 40681 srfi-18 mutex-unlock! breaks mutex on timeout reassign 40681 guile submitter 40681 d4ryus severity 40681 normal thanks From debbugs-submit-bounces@debbugs.gnu.org Fri Apr 17 11:50:19 2020 Received: (at submit) by debbugs.gnu.org; 17 Apr 2020 15:50:20 +0000 Received: from localhost ([127.0.0.1]:41516 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jPTFz-0001Q5-C7 for submit@debbugs.gnu.org; Fri, 17 Apr 2020 11:50:19 -0400 Received: from lists.gnu.org ([209.51.188.17]:59812) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1jPSoz-0000je-TI for submit@debbugs.gnu.org; Fri, 17 Apr 2020 11:22:26 -0400 Received: from eggs.gnu.org ([2001:470:142:3::10]:51390) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jPSoy-0003Pi-Ee for bug-guile@gnu.org; Fri, 17 Apr 2020 11:22:25 -0400 X-Spam-Checker-Version: SpamAssassin 3.3.2 (2011-06-06) on eggs.gnu.org X-Spam-Level: *** X-Spam-Status: No, score=3.3 required=5.0 tests=BAYES_50, RECEIVED_FROM_WINDOWS_HOST,URIBL_BLOCKED autolearn=disabled version=3.3.2 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jPSoo-00017J-AB for bug-guile@gnu.org; Fri, 17 Apr 2020 11:22:24 -0400 Received: from mail.teknik.io ([5.79.72.163]:64937) by eggs.gnu.org with esmtps (TLS1.0:DHE_RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jPSon-00016E-Uj for bug-guile@gnu.org; Fri, 17 Apr 2020 11:22:14 -0400 dkim-signature: v=1; a=rsa-sha256; d=teknik.io; s=dkim; c=relaxed/relaxed; q=dns/txt; h=From:Subject:Date:Message-ID:To:MIME-Version:Content-Type; bh=CwmjZ97ZpWTUHKfRlJ6VD1OXc1HWr+/lz2STYwVK9tg=; b=SFnvGUqFXjY0RAZOLq3AffMDVbt2HG0VJ/NLtHfFd+vLwBkfQlXnKVk37EivTsbMec7nhI/xU9HwP6s17OSbPmIuPW0UNTWW1hh466EktUuaM91iJiOzERnTvgnGp/wrLH1fR58oVwV+yBNfEfZTYJ4o1Ad/+EYWUpDbMuwDZbkzO1qj7pFtnHzoWKSAqaOeq9rotOUvSJkXX3VsZ3NRf8ORmwnqsoZRgAGrdyqWNF0pV+fF48dkxwMOf4 xaaRyTzaoPxgNPD/5RZW6IRa+rQIc5/TCSOjDcLzGpc5PfnJMNPLSXq4k4sNYHI/uOysH55mP5AWqxSh0bkrWz5i2pTw== Received: from localhost (ppp-188-174-62-31.dynamic.mnet-online.de [188.174.62.31]) by mail.teknik.io with ESMTPSA (version=TLSv1.2 cipher=ECDHE-ECDSA-AES256-GCM-SHA384 bits=256) ; Fri, 17 Apr 2020 07:21:52 -0700 Date: Fri, 17 Apr 2020 16:21:52 +0200 From: d4ryus To: bug-guile@gnu.org Subject: srfi-18 mutex-unlock! breaks mutex on timeout Message-ID: <20200417142152.GA2619432@gandalf.d4ryus.net> MIME-Version: 1.0 Content-Type: multipart/mixed; boundary="2oS5YaxWCcQjTEyO" Content-Disposition: inline X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] X-Received-From: 5.79.72.163 X-Spam-Score: 0.2 (/) X-Debbugs-Envelope-To: submit X-Mailman-Approved-At: Fri, 17 Apr 2020 11:50:18 -0400 X-BeenThere: debbugs-submit@debbugs.gnu.org X-Mailman-Version: 2.1.18 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: debbugs-submit-bounces@debbugs.gnu.org Sender: "Debbugs-submit" X-Spam-Score: -0.8 (/) --2oS5YaxWCcQjTEyO Content-Type: text/plain; charset=us-ascii Content-Disposition: inline hi, when mutex-unlock! is called (master: module/srfi/srfi-18.scm +306) with a condition and a timeout, it first resets the owner and then waits for the condition. If the timeout is reached (threads:wait-condition-variable returns #f) the cond's else condition returns #f. Now the owner is #f, which prevents one from unlocking the mutex, due to the early return if owner is #f. Reproducer (also attached to the email): (use-modules (srfi srfi-18)) (let ((condition (make-condition-variable)) (mutex (make-mutex)) (timeout (seconds->time (+ (time->seconds (current-time)) 1)))) ;; 1 second timeout (mutex-lock! mutex) (when (mutex-unlock! mutex condition timeout) ;; Mutex is unlocked, everything is fine. This is not reached ;; though, as nobody signals the condition (error "Not reached")) ;; Timeout was reached ;; Now the mutex has no owner but is stilled locked ;; Calling mutex-unlock! has no effect (mutex-unlock! mutex) ;; And a call to lock will now block forever (mutex-lock! mutex)) This affects guile 2.2 and master. A fix would be to only reset the owner when the mutex is truly unlocked, e.g. something along the lines of (also attached to the email): diff --git a/module/srfi/srfi-18.scm b/module/srfi/srfi-18.scm index 79aedb8d1..7da6254d4 100644 --- a/module/srfi/srfi-18.scm +++ b/module/srfi/srfi-18.scm @@ -307,17 +307,19 @@ object (absolute point in time), or #f." (timeout %unlock-sentinel)) (let ((timeout (timeout->absolute-time timeout))) (when (mutex-owner mutex) - (set-mutex-owner! mutex #f) (cond ((eq? cond-var %unlock-sentinel) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) ((eq? timeout %unlock-sentinel) (threads:wait-condition-variable (condition-variable-prim cond-var) (mutex-prim mutex)) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) ((threads:wait-condition-variable (condition-variable-prim cond-var) (mutex-prim mutex) timeout) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) (else #f))))) If you need any additional information let me know. Thanks for your great work! - d4ryus --2oS5YaxWCcQjTEyO Content-Type: application/vnd.lotus-screencam Content-Disposition: attachment; filename="reproducer.scm" Content-Transfer-Encoding: quoted-printable #! /bin/sh=0A# -*- mode: scheme; coding: utf-8 -*-=0Aexec guile -e main -s = "$0" "$@"=0A!#=0A=0A(use-modules (srfi srfi-18))=0A=0A(define (main . args)= =0A (let ((condition (make-condition-variable))=0A (mutex (make-mut= ex))=0A (timeout (seconds->time=0A (+ (time->second= s (current-time)) 1)))) ;; 1 second timeout=0A (mutex-lock! mutex)=0A = (when (mutex-unlock! mutex condition timeout)=0A ;; Mutex is unlocked= , everything is fine. This is not reached=0A ;; though, as nobody sign= als the condition=0A (error "Not reached"))=0A ;; Timeout was reach= ed=0A ;; Now the mutex as no owner but is stilled locked=0A ;; Callin= g mutex-unlock! has no effect=0A (mutex-unlock! mutex)=0A (mutex-lock= ! mutex)=0A ;; This is never reached=0A (display "Never reached!")))= =0A --2oS5YaxWCcQjTEyO Content-Type: text/plain; charset=us-ascii Content-Disposition: attachment; filename="potential-fix.patch" diff --git a/module/srfi/srfi-18.scm b/module/srfi/srfi-18.scm index 79aedb8d1..7da6254d4 100644 --- a/module/srfi/srfi-18.scm +++ b/module/srfi/srfi-18.scm @@ -307,17 +307,19 @@ object (absolute point in time), or #f." (timeout %unlock-sentinel)) (let ((timeout (timeout->absolute-time timeout))) (when (mutex-owner mutex) - (set-mutex-owner! mutex #f) (cond ((eq? cond-var %unlock-sentinel) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) ((eq? timeout %unlock-sentinel) (threads:wait-condition-variable (condition-variable-prim cond-var) (mutex-prim mutex)) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) ((threads:wait-condition-variable (condition-variable-prim cond-var) (mutex-prim mutex) timeout) + (set-mutex-owner! mutex #f) (threads:unlock-mutex (mutex-prim mutex))) (else #f))))) --2oS5YaxWCcQjTEyO--