GNU bug report logs - #38534
fluid-ref doesn't return defaults for thread local fluids

Previous Next

Package: guile;

Reported by: Rob Browning <rlb <at> defaultvalue.org>

Date: Sun, 8 Dec 2019 17:42:02 UTC

Severity: normal

Done: Andy Wingo <wingo <at> pobox.com>

Bug is archived. No further changes may be made.

To add a comment to this bug, you must first unarchive it, by sending
a message to control AT debbugs.gnu.org, with unarchive 38534 in the body.
You can then email your comments to 38534 AT debbugs.gnu.org in the normal way.

Toggle the display of automated, internal messages from the tracker.

View this report as an mbox folder, status mbox, maintainer mbox


Report forwarded to bug-guile <at> gnu.org:
bug#38534; Package guile. (Sun, 08 Dec 2019 17:42:02 GMT) Full text and rfc822 format available.

Acknowledgement sent to Rob Browning <rlb <at> defaultvalue.org>:
New bug report received and forwarded. Copy sent to bug-guile <at> gnu.org. (Sun, 08 Dec 2019 17:42:02 GMT) Full text and rfc822 format available.

Message #5 received at submit <at> debbugs.gnu.org (full text, mbox):

From: Rob Browning <rlb <at> defaultvalue.org>
To: bug-guile <at> gnu.org
Subject: fluid-ref doesn't return defaults for thread local fluids
Date: Sun, 08 Dec 2019 11:41:22 -0600
[Message part 1 (text/plain, inline)]
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:

[0001-Respect-thread-local-fluid-defaults.patch (text/x-diff, inline)]
From 31fa1050340271ca2f68ac5a6c66322912f915e0 Mon Sep 17 00:00:00 2001
From: Rob Browning <rlb <at> defaultvalue.org>
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

[Message part 3 (text/plain, inline)]
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

Reply sent to Andy Wingo <wingo <at> pobox.com>:
You have taken responsibility. (Sun, 12 Jan 2020 21:07:02 GMT) Full text and rfc822 format available.

Notification sent to Rob Browning <rlb <at> defaultvalue.org>:
bug acknowledged by developer. (Sun, 12 Jan 2020 21:07:02 GMT) Full text and rfc822 format available.

Message #10 received at 38534-done <at> debbugs.gnu.org (full text, mbox):

From: Andy Wingo <wingo <at> pobox.com>
To: Rob Browning <rlb <at> defaultvalue.org>
Cc: 38534-done <at> debbugs.gnu.org
Subject: Re: bug#38534: fluid-ref doesn't return defaults for thread local
 fluids
Date: Sun, 12 Jan 2020 22:06:42 +0100
On Sun 08 Dec 2019 18:41, Rob Browning <rlb <at> defaultvalue.org> writes:

> For example, in 2.2.6:
>
>   scheme@(guile-user)> (define x (make-thread-local-fluid 'default))
>   scheme@(guile-user)> (fluid-ref x)
>   $1 = #f

Applied your patch on both branches; thank you!

Andy




bug archived. Request was from Debbugs Internal Request <help-debbugs <at> gnu.org> to internal_control <at> debbugs.gnu.org. (Mon, 10 Feb 2020 12:24:05 GMT) Full text and rfc822 format available.

This bug report was last modified 5 years and 143 days ago.

Previous Next


GNU bug tracking system
Copyright (C) 1999 Darren O. Benham, 1997,2003 nCipher Corporation Ltd, 1994-97 Ian Jackson.