projects
/
sbcl.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
1.1.13: will be tagged as "sbcl-1.1.13"
[sbcl.git]
/
src
/
runtime
/
dynbind.c
diff --git
a/src/runtime/dynbind.c
b/src/runtime/dynbind.c
index
32f79f0
..
d89bc7d
100644
(file)
--- a/
src/runtime/dynbind.c
+++ b/
src/runtime/dynbind.c
@@
-1,5
+1,6
@@
/*
* support for dynamic binding from C
/*
* support for dynamic binding from C
+ * See the "Chapter 9: Specials" of the SBCL Internals Manual.
*/
/*
*/
/*
@@
-40,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);
&((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);
if(!sym->tls_index) {
sym->tls_index=SymbolValue(FREE_TLS_INDEX,0);
SetSymbolValue(FREE_TLS_INDEX, sym->tls_index+N_WORD_BYTES, 0);
@@
-54,10
+55,13
@@
void bind_variable(lispobj symbol, lispobj value, void *th)
if (get_pseudo_atomic_interrupted(thread))
do_pending_interrupt();
}
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->symbol = symbol;
+ binding->value = SymbolTlValue(symbol, thread);
+#endif
SetTlSymbolValue(symbol, value, thread);
}
SetTlSymbolValue(symbol, value, thread);
}
@@
-70,9
+74,16
@@
unbind(void *th)
binding = ((struct binding *)get_binding_stack_pointer(thread)) - 1;
binding = ((struct binding *)get_binding_stack_pointer(thread)) - 1;
+ /* On sb-thread, it's actually a tls-index */
symbol = binding->symbol;
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;
binding->symbol = 0;
binding->value = 0;
@@
-94,7
+105,12
@@
unbind_to_here(lispobj *bsp,void *th)
symbol = binding->symbol;
if (symbol) {
if (symbol != UNBOUND_MARKER_WIDETAG) {
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;
}
binding->symbol = 0;
binding->value = 0;