diff options
Diffstat (limited to 'mit-pthreads/pthreads/info.c')
-rw-r--r-- | mit-pthreads/pthreads/info.c | 77 |
1 files changed, 77 insertions, 0 deletions
diff --git a/mit-pthreads/pthreads/info.c b/mit-pthreads/pthreads/info.c new file mode 100644 index 00000000000..2b9722ba291 --- /dev/null +++ b/mit-pthreads/pthreads/info.c @@ -0,0 +1,77 @@ +/* hello */ + +#include <stdio.h> +#include <pthread.h> +#include <signal.h> + +static const char *const state_names[] = { +#define __pthread_defstate(S,NAME) NAME, +#include "pthread/state.def" +#undef __pthread_defstate + 0 +}; + +void (*dump_thread_info_fn) (struct pthread *, FILE *); + +static void +dump_thread_info (thread, file) + struct pthread *thread; + FILE *file; +{ + /* machdep */ + /* attr */ + /* signals */ + /* wakeup_time */ + /* join */ + fprintf (file, " thread @%p prio %3d %s", thread, + thread->pthread_priority, state_names[(int) thread->state]); + switch (thread->state) { + case PS_FDLR_WAIT: + fprintf (file, " fd %d[%d]", thread->data.fd.fd, + thread->data.fd.branch); + fprintf (file, " owner %pr/%pw", + fd_table[thread->data.fd.fd]->r_owner, + fd_table[thread->data.fd.fd]->w_owner); + break; + } + /* show where the signal handler gets run */ + if (thread == pthread_run) + fprintf (file, "\t\t[ME!]"); + fprintf (file, "\n"); + if (dump_thread_info_fn) + (*dump_thread_info_fn) (thread, file); +} + +static void +pthread_dump_info_to_file (file) + FILE *file; +{ + pthread_t t; + for (t = pthread_link_list; t; t = t->pll) + dump_thread_info (t, file); +} + +void +pthread_dump_info () +{ + if (ftrylockfile (stderr) != 0) + return; + fprintf (stderr, "process id %ld:\n", (long) getpid ()); + pthread_dump_info_to_file (stderr); + funlockfile (stderr); +} + +#ifdef SIGINFO +static void +sig_handler (sig) + int sig; +{ + pthread_dump_info (); +} + +void +pthread_setup_siginfo () +{ + (void) signal (SIGINFO, sig_handler); +} +#endif |