From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!not-for-mail From: ludo@gnu.org (Ludovic =?iso-8859-1?Q?Court=E8s?=) Newsgroups: gmane.lisp.guile.devel Subject: Re: Race condition in threading code? Date: Sun, 31 Aug 2008 22:08:37 +0200 Message-ID: <871w05x7zu.fsf@gnu.org> References: <2bc5f8210808161142n2b415569y8499f3efafb4a@mail.gmail.com> NNTP-Posting-Host: lo.gmane.org Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Trace: ger.gmane.org 1220213341 20543 80.91.229.12 (31 Aug 2008 20:09:01 GMT) X-Complaints-To: usenet@ger.gmane.org NNTP-Posting-Date: Sun, 31 Aug 2008 20:09:01 +0000 (UTC) To: guile-devel@gnu.org Original-X-From: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Sun Aug 31 22:09:55 2008 Return-path: Envelope-to: guile-devel@m.gmane.org Original-Received: from lists.gnu.org ([199.232.76.165]) by lo.gmane.org with esmtp (Exim 4.50) id 1KZtFC-0003qs-9d for guile-devel@m.gmane.org; Sun, 31 Aug 2008 22:09:54 +0200 Original-Received: from localhost ([127.0.0.1]:35916 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KZtED-0005rk-Ly for guile-devel@m.gmane.org; Sun, 31 Aug 2008 16:08:53 -0400 Original-Received: from mailman by lists.gnu.org with tmda-scanned (Exim 4.43) id 1KZtEA-0005rI-UH for guile-devel@gnu.org; Sun, 31 Aug 2008 16:08:50 -0400 Original-Received: from exim by lists.gnu.org with spam-scanned (Exim 4.43) id 1KZtE9-0005qs-60 for guile-devel@gnu.org; Sun, 31 Aug 2008 16:08:50 -0400 Original-Received: from [199.232.76.173] (port=47675 helo=monty-python.gnu.org) by lists.gnu.org with esmtp (Exim 4.43) id 1KZtE9-0005qp-3O for guile-devel@gnu.org; Sun, 31 Aug 2008 16:08:49 -0400 Original-Received: from main.gmane.org ([80.91.229.2]:43438 helo=ciao.gmane.org) by monty-python.gnu.org with esmtps (TLS-1.0:RSA_AES_256_CBC_SHA1:32) (Exim 4.60) (envelope-from ) id 1KZtE8-0006Sq-Hp for guile-devel@gnu.org; Sun, 31 Aug 2008 16:08:48 -0400 Original-Received: from list by ciao.gmane.org with local (Exim 4.43) id 1KZtE7-00019r-7T for guile-devel@gnu.org; Sun, 31 Aug 2008 20:08:47 +0000 Original-Received: from reverse-83.fdn.fr ([80.67.176.83]) by main.gmane.org with esmtp (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 31 Aug 2008 20:08:47 +0000 Original-Received: from ludo by reverse-83.fdn.fr with local (Gmexim 0.1 (Debian)) id 1AlnuQ-0007hv-00 for ; Sun, 31 Aug 2008 20:08:47 +0000 X-Injected-Via-Gmane: http://gmane.org/ Original-Lines: 59 Original-X-Complaints-To: usenet@ger.gmane.org X-Gmane-NNTP-Posting-Host: reverse-83.fdn.fr X-URL: http://www.fdn.fr/~lcourtes/ X-Revolutionary-Date: 15 Fructidor an 216 de la =?iso-8859-1?Q?R=E9volutio?= =?iso-8859-1?Q?n?= X-PGP-Key-ID: 0xEA52ECF4 X-PGP-Key: http://www.fdn.fr/~lcourtes/ludovic.asc X-PGP-Fingerprint: 821D 815D 902A 7EAB 5CEE D120 7FBA 3D4F EB1F 5364 X-OS: i686-pc-linux-gnu User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.2 (gnu/linux) Cancel-Lock: sha1:SdBFFH2eNW0fncTsNa3gEn4QFLw= X-detected-kernel: by monty-python.gnu.org: Linux 2.6, seldom 2.4 (older, 4) X-BeenThere: guile-devel@gnu.org X-Mailman-Version: 2.1.5 Precedence: list List-Id: "Developers list for Guile, the GNU extensibility library" List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Original-Sender: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Errors-To: guile-devel-bounces+guile-devel=m.gmane.org@gnu.org Xref: news.gmane.org gmane.lisp.guile.devel:7562 Archived-At: Hello, Andy Wingo writes: > ERROR: srfi-18.test: thread-start!: > thread activates only after start > - arguments: ((syntax-error "memoization" > "In file ~S, line ~S: ~A ~S in expression ~S." > ("/home/lilydev/vc/guile/srfi/srfi-18.scm" 135 > "Bad binding" ct > (let (ct (current-thread)) > #@let (or (hashq-ref thread-exception-handlers ct) > (hashq-set! thread-exception-handlers ct > (list initial-handler))))) #f)) I'm seeing this as well, but it's a `#@let*' here (single-binding `let's are memoized as `#@let*'): ((syntax-error "memoization" "In file ~S, line ~S: ~A ~S in expression ~S." ("/home/ludo/src/guile/srfi/srfi-18.scm" 138 "Bad binding" ct (#@let* (ct (#>)) (#@or (#> #> #@0-0) (#> #> #@0-0 (#> #>)) ))) #f)) It can be reproduced, but very infrequently, with this program: (use-modules (ice-9 threads)) (define (foo x y) (let ((z (+ x y))) (let ((a (+ z 1))) (let ((b (- a 2))) (let ((c (* b 3))) c))))) (define (entry) (foo 1 2)) (for-each (lambda (i) (make-thread entry)) (iota 123)) My explanation is that the `let*' memoizer, aka. `scm_m_letstar ()', is not thread-safe; it's clearly not atomic, and it's of course not protected by a mutex or so. I can't think of any simple fix. `scm_m_letstar ()' could be made atomic by having it duplicate the input list instead of modifying it directly; it could then atomically update the input. However, allocating cells during memoization wouldn't be a good idea performance-wise. Thanks, Ludo'.