From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.io!.POSTED.ciao.gmane.io!not-for-mail From: d4ryus via "Bug reports for GUILE, GNU's Ubiquitous Extension Language" Newsgroups: gmane.lisp.guile.bugs Subject: bug#40681: srfi-18 mutex-unlock! breaks mutex on timeout Date: Fri, 17 Apr 2020 16:21:52 +0200 Message-ID: <20200417142152.GA2619432@gandalf.d4ryus.net> Reply-To: d4ryus Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="2oS5YaxWCcQjTEyO" Injection-Info: ciao.gmane.io; posting-host="ciao.gmane.io:159.69.161.202"; logging-data="15170"; mail-complaints-to="usenet@ciao.gmane.io" To: 40681@debbugs.gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane-mx.org@gnu.org Fri Apr 17 17:51:10 2020 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 1jPTGo-0003qt-Be for guile-bugs@m.gmane-mx.org; Fri, 17 Apr 2020 17:51:10 +0200 Original-Received: from localhost ([::1]:48810 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jPTGn-0001Ob-Dd for guile-bugs@m.gmane-mx.org; Fri, 17 Apr 2020 11:51:09 -0400 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:55674) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1jPTGh-0001NS-GM for bug-guile@gnu.org; Fri, 17 Apr 2020 11:51:04 -0400 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1jPTGg-0001OR-9T for bug-guile@gnu.org; Fri, 17 Apr 2020 11:51:03 -0400 Original-Received: from debbugs.gnu.org ([209.51.188.43]:58210) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1jPTGg-0001OD-3C for bug-guile@gnu.org; Fri, 17 Apr 2020 11:51:02 -0400 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1jPTGg-0001RW-11 for bug-guile@gnu.org; Fri, 17 Apr 2020 11:51:02 -0400 X-Loop: help-debbugs@gnu.org Resent-From: d4ryus Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Fri, 17 Apr 2020 15:51:01 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 40681 X-GNU-PR-Package: guile X-Debbugs-Original-To: bug-guile@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.15871386205465 (code B ref -1); Fri, 17 Apr 2020 15:51:01 +0000 Original-Received: (at submit) by debbugs.gnu.org; 17 Apr 2020 15:50:20 +0000 Original-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 Original-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 Original-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 Original-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 Original-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== Original-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 Content-Disposition: inline X-detected-operating-system: by eggs.gnu.org: Windows 7 or 8 [fuzzy] 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 X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] X-Received-From: 209.51.188.43 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: , Errors-To: bug-guile-bounces+guile-bugs=m.gmane-mx.org@gnu.org Original-Sender: "bug-guile" Xref: news.gmane.io gmane.lisp.guile.bugs:9717 Archived-At: --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--