#include "thread.h"
#ifdef LISP_FEATURE_OS_PROVIDES_DLADDR
+# ifndef __USE_GNU
/* __USE_GNU needed if we want dladdr() and Dl_Info from glibc. */
-#define __USE_GNU
-#include "dlfcn.h"
+# define __USE_GNU
+# endif
+# include "dlfcn.h"
#endif
#if !(defined(LISP_FEATURE_X86) || defined(LISP_FEATURE_X86_64))
static int
altstack_pointer_p (void *p) {
#ifndef LISP_FEATURE_WIN32
- char* stack_start = ((char *) arch_os_get_current_thread())
- + dynamic_values_bytes;
- char* stack_end = stack_start + 32*SIGSTKSZ;
+ void* stack_start = arch_os_get_current_thread() + dynamic_values_bytes;
+ void* stack_end = stack_start + 32*SIGSTKSZ;
return (p > stack_start && p <= stack_end);
#else
if (i == len)
return ((struct compiled_debug_fun *) native_pointer(v->data[i - 1]));
- if (offset >= fixnum_value(df->elsewhere_pc)) {
+ if (offset >= (unsigned long)fixnum_value(df->elsewhere_pc)) {
struct compiled_debug_fun *p
= ((struct compiled_debug_fun *) native_pointer(v->data[i + 1]));
next_pc = fixnum_value(p->elsewhere_pc);
}
}
+void
+describe_thread_state(void)
+{
+ sigset_t mask;
+ struct thread *thread = arch_os_get_current_thread();
+#ifndef LISP_FEATURE_WIN32
+ thread_sigmask(SIG_SETMASK, NULL, &mask);
+ printf("Signal mask:\n");
+ printf(" SIGALRM = %d\n", sigismember(&mask, SIGALRM));
+ printf(" SIGINT = %d\n", sigismember(&mask, SIGINT));
+ printf(" SIGPROF = %d\n", sigismember(&mask, SIGPROF));
+#ifdef SIG_INTERRUPT_THREAD
+ printf(" SIG_INTERRUPT_THREAD = %d\n", sigismember(&mask, SIG_INTERRUPT_THREAD));
+#endif
+#ifdef SIG_STOP_FOR_GC
+ printf(" SIG_STOP_FOR_GC = %d\n", sigismember(&mask, SIG_STOP_FOR_GC));
+#endif
+#endif
+ printf("Specials:\n");
+ printf(" *GC-INHIBIT* = %s\n", (SymbolValue(GC_INHIBIT, thread) == T) ? "T" : "NIL");
+ printf(" *GC-PENDING* = %s\n",
+ (SymbolValue(GC_PENDING, thread) == T) ?
+ "T" : ((SymbolValue(GC_PENDING, thread) == NIL) ?
+ "NIL" : ":IN-PROGRESS"));
+ printf(" *INTERRUPTS-ENABLED* = %s\n", (SymbolValue(INTERRUPTS_ENABLED, thread) == T) ? "T" : "NIL");
+#ifdef STOP_FOR_GC_PENDING
+ printf(" *STOP-FOR-GC-PENDING* = %s\n", (SymbolValue(STOP_FOR_GC_PENDING, thread) == T) ? "T" : "NIL");
+#endif
+}
+
/* This function has been split from backtrace() to enable Lisp
* backtraces from gdb with call backtrace_from_fp(...). Useful for
* example when debugging threading deadlocks.
backtrace(int nframes)
{
void *fp;
- int i;
#if defined(LISP_FEATURE_X86)
asm("movl %%ebp,%0" : "=g" (fp));