#include "globals.h"
#include "runtime.h"
#include "os.h"
-#include "interrupt.h"
#ifdef LISP_FEATURE_GENCGC
#include "gencgc-alloc-region.h"
#else
#include "genesis/static-symbols.h"
#include "genesis/thread.h"
#include "genesis/fdefn.h"
+#include "interrupt.h"
#define STATE_RUNNING (make_fixnum(1))
#define STATE_SUSPENDED (make_fixnum(2))
pthread_mutex_unlock(thread->state_lock);
}
+extern pthread_key_t lisp_thread;
#endif
+extern int kill_safely(os_thread_t os_thread, int signal);
+
#define THREAD_SLOT_OFFSET_WORDS(c) \
(offsetof(struct thread,c)/(sizeof (struct thread *)))
return ((struct fdefn *)native_pointer(SymbolValue(sym, 0)))->fun;
}
-static inline
-os_context_t *get_interrupt_context_for_thread(struct thread *th)
-{
- return th->interrupt_contexts
- [fixnum_value(SymbolValue(FREE_INTERRUPT_CONTEXT_INDEX,th)-1)];
-}
+/* These are for use during GC, on the current thread, or on prenatal
+ * threads only. */
+#if defined(LISP_FEATURE_SB_THREAD)
+#define get_binding_stack_pointer(thread) \
+ ((thread)->binding_stack_pointer)
+#define set_binding_stack_pointer(thread,value) \
+ ((thread)->binding_stack_pointer = (lispobj *)(value))
+#define access_control_stack_pointer(thread) \
+ ((thread)->control_stack_pointer)
+# if !defined(LISP_FEATURE_X86) && !defined(LISP_FEATURE_X86_64)
+#define access_control_frame_pointer(thread) \
+ ((thread)->control_frame_pointer)
+# endif
+#elif defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64)
+#define get_binding_stack_pointer(thread) \
+ SymbolValue(BINDING_STACK_POINTER, thread)
+#define set_binding_stack_pointer(thread,value) \
+ SetSymbolValue(BINDING_STACK_POINTER, (lispobj)(value), thread)
+#define access_control_stack_pointer(thread) \
+ (current_control_stack_pointer)
+#else
+#define get_binding_stack_pointer(thread) \
+ (current_binding_stack_pointer)
+#define set_binding_stack_pointer(thread,value) \
+ (current_binding_stack_pointer = (lispobj *)(value))
+#define access_control_stack_pointer(thread) \
+ (current_control_stack_pointer)
+#define access_control_frame_pointer(thread) \
+ (current_control_frame_pointer)
+#endif
#if defined(LISP_FEATURE_SB_THREAD) && defined(LISP_FEATURE_GCC_TLS)
extern __thread struct thread *current_thread;
#endif
extern void create_initial_thread(lispobj);
-extern int kill_thread_safely(os_thread_t os_thread, int signo);
#endif /* _INCLUDE_THREAD_H_ */