gencgc: More precise conservatism for pointers to boxed pages.
[sbcl.git] / src / runtime / dynbind.c
index 9acc23b..d89bc7d 100644 (file)
@@ -1,5 +1,6 @@
 /*
  * support for dynamic binding from C
+ * See the "Chapter 9: Specials" of the SBCL Internals Manual.
  */
 
 /*
@@ -24,7 +25,6 @@
 #include "pseudo-atomic.h"
 #include "genesis/symbol.h"
 #include "genesis/binding.h"
-#include "genesis/thread.h"
 #include "genesis/static-symbols.h"
 
 void bind_variable(lispobj symbol, lispobj value, void *th)
@@ -41,7 +41,7 @@ void bind_variable(lispobj symbol, lispobj value, void *th)
                 &((struct symbol *)native_pointer(TLS_INDEX_LOCK))->value;
             FSHOW_SIGNAL((stderr, "entering dynbind tls alloc\n"));
             set_pseudo_atomic_atomic(thread);
-            get_spinlock(tls_index_lock,(long)th);
+            get_spinlock(tls_index_lock,(uword_t)th);
             if(!sym->tls_index) {
                 sym->tls_index=SymbolValue(FREE_TLS_INDEX,0);
                 SetSymbolValue(FREE_TLS_INDEX, sym->tls_index+N_WORD_BYTES, 0);
@@ -55,10 +55,13 @@ void bind_variable(lispobj symbol, lispobj value, void *th)
             if (get_pseudo_atomic_interrupted(thread))
                 do_pending_interrupt();
         }
+        binding->symbol = sym->tls_index;
+        binding->value = SymbolTlValue(symbol, thread);
     }
-#endif
-    binding->value = SymbolTlValue(symbol, thread);
+#else
     binding->symbol = symbol;
+    binding->value = SymbolTlValue(symbol, thread);
+#endif
     SetTlSymbolValue(symbol, value, thread);
 }
 
@@ -71,9 +74,16 @@ unbind(void *th)
 
     binding = ((struct binding *)get_binding_stack_pointer(thread)) - 1;
 
+    /* On sb-thread, it's actually a tls-index */
     symbol = binding->symbol;
 
-    SetTlSymbolValue(symbol, binding->value,thread);
+#ifdef LISP_FEATURE_SB_THREAD
+
+    ((union per_thread_data *)thread)->dynamic_values[(symbol) >> WORD_SHIFT]
+        = binding->value;
+#else
+    SetSymbolValue(symbol, binding->value, thread);
+#endif
 
     binding->symbol = 0;
     binding->value = 0;
@@ -95,7 +105,12 @@ unbind_to_here(lispobj *bsp,void *th)
         symbol = binding->symbol;
         if (symbol) {
             if (symbol != UNBOUND_MARKER_WIDETAG) {
-                SetTlSymbolValue(symbol, binding->value,thread);
+#ifdef LISP_FEATURE_SB_THREAD
+                ((union per_thread_data *)thread)->dynamic_values[(symbol) >> WORD_SHIFT]
+                    = binding->value;
+#else
+                SetSymbolValue(symbol, binding->value, thread);
+#endif
             }
             binding->symbol = 0;
             binding->value = 0;