#include "globals.h"
#include "dynbind.h"
#include "thread.h"
+#include "pseudo-atomic.h"
#include "genesis/symbol.h"
#include "genesis/binding.h"
#include "genesis/thread.h"
void bind_variable(lispobj symbol, lispobj value, void *th)
{
- lispobj old_tl_value;
struct binding *binding;
struct thread *thread=(struct thread *)th;
binding = GetBSP();
if(!sym->tls_index) {
lispobj *tls_index_lock=
&((struct symbol *)native_pointer(TLS_INDEX_LOCK))->value;
- SetSymbolValue(PSEUDO_ATOMIC_INTERRUPTED, make_fixnum(0),th);
- SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(1),th);
+ clear_pseudo_atomic_interrupted(th);
+ set_pseudo_atomic_atomic(th);
get_spinlock(tls_index_lock,(long)th);
if(!sym->tls_index) {
sym->tls_index=SymbolValue(FREE_TLS_INDEX,0);
make_fixnum(fixnum_value(sym->tls_index)+1),0);
}
release_spinlock(tls_index_lock);
- SetSymbolValue(PSEUDO_ATOMIC_ATOMIC, make_fixnum(0),th);
- if (fixnum_value(SymbolValue(PSEUDO_ATOMIC_INTERRUPTED,th)))
+ clear_pseudo_atomic_atomic(th);
+ if (get_pseudo_atomic_interrupted(th))
do_pending_interrupt();
}
}
#endif
- old_tl_value=SymbolTlValue(symbol,thread);
- binding->value = old_tl_value;
+ binding->value = SymbolTlValue(symbol, thread);
binding->symbol = symbol;
- SetTlSymbolValue(symbol, value,thread);
+ SetTlSymbolValue(symbol, value, thread);
}
void
symbol = binding->symbol;
if (symbol) {
- SetTlSymbolValue(symbol, binding->value,thread);
+ if (symbol != UNBOUND_MARKER_WIDETAG) {
+ SetTlSymbolValue(symbol, binding->value,thread);
+ }
binding->symbol = 0;
}
}