From mboxrd@z Thu Jan 1 00:00:00 1970 Path: news.gmane.org!.POSTED.blaine.gmane.org!not-for-mail From: Rob Browning Newsgroups: gmane.lisp.guile.bugs Subject: bug#38534: fluid-ref doesn't return defaults for thread local fluids Date: Sun, 08 Dec 2019 11:41:22 -0600 Message-ID: <87pngy90l9.fsf@trouble.defaultvalue.org> Mime-Version: 1.0 Content-Type: multipart/mixed; boundary="=-=-=" Injection-Info: blaine.gmane.org; posting-host="blaine.gmane.org:195.159.176.226"; logging-data="71471"; mail-complaints-to="usenet@blaine.gmane.org" To: 38534@debbugs.gnu.org Original-X-From: bug-guile-bounces+guile-bugs=m.gmane.org@gnu.org Sun Dec 08 18:42:27 2019 Return-path: Envelope-to: guile-bugs@m.gmane.org Original-Received: from lists.gnu.org ([209.51.188.17]) by blaine.gmane.org with esmtps (TLS1.2:ECDHE_RSA_AES_256_GCM_SHA384:256) (Exim 4.89) (envelope-from ) id 1ie0Ze-000IT9-99 for guile-bugs@m.gmane.org; Sun, 08 Dec 2019 18:42:26 +0100 Original-Received: from localhost ([::1]:60402 helo=lists1p.gnu.org) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ie0Zd-0002g7-5P for guile-bugs@m.gmane.org; Sun, 08 Dec 2019 12:42:25 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:59172) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ie0ZJ-0002bE-Rw for bug-guile@gnu.org; Sun, 08 Dec 2019 12:42:07 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ie0ZI-00071V-EY for bug-guile@gnu.org; Sun, 08 Dec 2019 12:42:05 -0500 Original-Received: from debbugs.gnu.org ([209.51.188.43]:46247) by eggs.gnu.org with esmtps (TLS1.0:RSA_AES_128_CBC_SHA1:16) (Exim 4.71) (envelope-from ) id 1ie0ZG-00070y-L0 for bug-guile@gnu.org; Sun, 08 Dec 2019 12:42:03 -0500 Original-Received: from Debian-debbugs by debbugs.gnu.org with local (Exim 4.84_2) (envelope-from ) id 1ie0ZG-0004LW-Jr for bug-guile@gnu.org; Sun, 08 Dec 2019 12:42:02 -0500 X-Loop: help-debbugs@gnu.org Resent-From: Rob Browning Original-Sender: "Debbugs-submit" Resent-CC: bug-guile@gnu.org Resent-Date: Sun, 08 Dec 2019 17:42:02 +0000 Resent-Message-ID: Resent-Sender: help-debbugs@gnu.org X-GNU-PR-Message: report 38534 X-GNU-PR-Package: guile X-Debbugs-Original-To: bug-guile@gnu.org Original-Received: via spool by submit@debbugs.gnu.org id=B.157582689716672 (code B ref -1); Sun, 08 Dec 2019 17:42:02 +0000 Original-Received: (at submit) by debbugs.gnu.org; 8 Dec 2019 17:41:37 +0000 Original-Received: from localhost ([127.0.0.1]:52220 helo=debbugs.gnu.org) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ie0Yq-0004Kp-RP for submit@debbugs.gnu.org; Sun, 08 Dec 2019 12:41:37 -0500 Original-Received: from lists.gnu.org ([209.51.188.17]:35412) by debbugs.gnu.org with esmtp (Exim 4.84_2) (envelope-from ) id 1ie0Yp-0004Ki-OK for submit@debbugs.gnu.org; Sun, 08 Dec 2019 12:41:36 -0500 Original-Received: from eggs.gnu.org ([2001:470:142:3::10]:58482) by lists.gnu.org with esmtp (Exim 4.90_1) (envelope-from ) id 1ie0Yn-0002aF-AG for bug-guile@gnu.org; Sun, 08 Dec 2019 12:41:35 -0500 Original-Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1ie0Yk-0005wL-2V for bug-guile@gnu.org; Sun, 08 Dec 2019 12:41:32 -0500 Original-Received: from defaultvalue.org ([45.33.119.55]:36840) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1ie0Yh-0005rY-71 for bug-guile@gnu.org; Sun, 08 Dec 2019 12:41:27 -0500 Original-Received: from trouble.defaultvalue.org (localhost [127.0.0.1]) (Authenticated sender: rlb@defaultvalue.org) by defaultvalue.org (Postfix) with ESMTPSA id 7EB51200AC for ; Sun, 8 Dec 2019 11:41:21 -0600 (CST) Original-Received: by trouble.defaultvalue.org (Postfix, from userid 1000) id 9F7D614E071; Sun, 8 Dec 2019 11:41:22 -0600 (CST) X-detected-operating-system: by eggs.gnu.org: GNU/Linux 2.2.x-3.x [generic] [fuzzy] 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.org@gnu.org Original-Sender: "bug-guile" Xref: news.gmane.org gmane.lisp.guile.bugs:9484 Archived-At: --=-=-= Content-Type: text/plain For example, in 2.2.6: scheme@(guile-user)> (define x (make-thread-local-fluid 'default)) scheme@(guile-user)> (fluid-ref x) $1 = #f Here's a possible fix and some (trivial) tests: --=-=-= Content-Type: text/x-diff Content-Disposition: inline; filename=0001-Respect-thread-local-fluid-defaults.patch Content-Description: 0001-Respect-thread-local-fluid-defaults.patch >From 31fa1050340271ca2f68ac5a6c66322912f915e0 Mon Sep 17 00:00:00 2001 From: Rob Browning Date: Sun, 8 Dec 2019 11:35:37 -0600 Subject: [PATCH 1/1] Respect thread local fluid defaults Previously (fluid-ref (make-thread-local-fluid #t)) would return #f via scm_fluid_ref because the internal scm_hashq_ref would return #f when the fluid had not been set, and that was interpreted as an actual value for the fluid. Instead, just pass the fluid default as the default for the hash table lookups so that we don't need a second step to determine if the fluid was set. Thanks to Andrew Gierth for tracking down the problem. --- These changes might not be OK if SCM_I_FLUID_DEFAULT can ever be very expensive, i.e. we wouldn't want to have to pay that cost for every lookup. libguile/fluids.c | 23 +++++++++-------------- test-suite/tests/fluids.test | 14 ++++++++++++-- 2 files changed, 21 insertions(+), 16 deletions(-) diff --git a/libguile/fluids.c b/libguile/fluids.c index c3dd1c9ea..472f92a06 100644 --- a/libguile/fluids.c +++ b/libguile/fluids.c @@ -343,22 +343,17 @@ fluid_ref (scm_t_dynamic_state *dynamic_state, SCM fluid) entry = scm_cache_lookup (&dynamic_state->cache, fluid); if (scm_is_eq (SCM_PACK (entry->key), fluid)) - val = SCM_PACK (entry->value); - else - { - if (SCM_I_FLUID_THREAD_LOCAL_P (fluid)) - val = scm_hashq_ref (dynamic_state->thread_local_values, fluid, - SCM_UNDEFINED); - else - val = scm_weak_table_refq (dynamic_state->values, fluid, - SCM_UNDEFINED); + return SCM_PACK (entry->value); - if (SCM_UNBNDP (val)) - val = SCM_I_FLUID_DEFAULT (fluid); + if (SCM_I_FLUID_THREAD_LOCAL_P (fluid)) + val = scm_hashq_ref (dynamic_state->thread_local_values, fluid, + SCM_I_FLUID_DEFAULT (fluid)); + else + val = scm_weak_table_refq (dynamic_state->values, fluid, + SCM_I_FLUID_DEFAULT (fluid)); - /* Cache this lookup. */ - fluid_set_x (dynamic_state, fluid, val); - } + /* Cache this lookup. */ + fluid_set_x (dynamic_state, fluid, val); return val; } diff --git a/test-suite/tests/fluids.test b/test-suite/tests/fluids.test index a5ca8857e..949d50410 100644 --- a/test-suite/tests/fluids.test +++ b/test-suite/tests/fluids.test @@ -49,8 +49,18 @@ (interaction-environment)))) (with-test-prefix "initial fluid values" - (pass-if "fluid-ref uninitialized fluid is #f" - (not (fluid-ref a))) + + (pass-if "fluid-ref returns #f for uninitialized fluid" + (eq? #f (fluid-ref (make-fluid)))) + + (pass-if "fluid-ref returns #f for uninitialized thread local fluid" + (eq? #f (fluid-ref (make-thread-local-fluid)))) + + (pass-if "fluid-ref returns default" + (eq? #t (fluid-ref (make-fluid #t)))) + + (pass-if "fluid-ref returns thread local default" + (eq? #t (fluid-ref (make-thread-local-fluid #t)))) (pass-if "initial value is inherited from parent thread" (if (provided? 'threads) -- 2.24.0 --=-=-= Content-Type: text/plain Thanks -- Rob Browning rlb @defaultvalue.org and @debian.org GPG as of 2011-07-10 E6A9 DA3C C9FD 1FF8 C676 D2C4 C0F0 39E9 ED1B 597A GPG as of 2002-11-03 14DD 432F AE39 534D B592 F9A0 25C8 D377 8C7E 73A4 --=-=-=--