Print this page
8158 Want named threads API
9857 proc manpages should have LIBRARY section

*** 19,28 **** --- 19,30 ---- * CDDL HEADER END */ /* * Copyright 2010 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. + * + * Copyright 2018 Joyent, Inc. */ #include <sys/isa_defs.h> #include <stdio.h>
*** 135,145 **** static int thr_stack(const td_thrhandle_t *, void *); static void free_threadinfo(void); static struct threadinfo *find_thread(id_t); static int all_call_stacks(pstack_handle_t *, int); ! static void tlhead(id_t, id_t); static int print_frame(void *, prgregset_t, uint_t, const long *); static void print_zombie(struct ps_prochandle *, struct threadinfo *); static void print_syscall(const lwpstatus_t *, prgregset_t); static void call_stack(pstack_handle_t *, const lwpstatus_t *); --- 137,147 ---- static int thr_stack(const td_thrhandle_t *, void *); static void free_threadinfo(void); static struct threadinfo *find_thread(id_t); static int all_call_stacks(pstack_handle_t *, int); ! static void tlhead(id_t, id_t, const char *); static int print_frame(void *, prgregset_t, uint_t, const long *); static void print_zombie(struct ps_prochandle *, struct threadinfo *); static void print_syscall(const lwpstatus_t *, prgregset_t); static void call_stack(pstack_handle_t *, const lwpstatus_t *);
*** 378,387 **** --- 380,390 ---- static int thread_call_stack(void *data, const lwpstatus_t *psp, const lwpsinfo_t *pip) { + char lwpname[THREAD_NAME_MAX] = ""; pstack_handle_t *h = data; lwpstatus_t lwpstatus; struct threadinfo *tip; if (!proc_lwp_in_set(h->lwps, pip->pr_lwpid))
*** 389,399 **** h->count++; if ((tip = find_thread(pip->pr_lwpid)) == NULL) return (0); ! tlhead(tip->threadid, pip->pr_lwpid); tip->threadid = 0; /* finish eliminating tid */ if (psp) call_stack(h, psp); else { if (tip->state == TD_THR_ZOMBIE) --- 392,405 ---- h->count++; if ((tip = find_thread(pip->pr_lwpid)) == NULL) return (0); ! (void) Plwp_getname(h->proc, pip->pr_lwpid, ! lwpname, sizeof (lwpname)); ! ! tlhead(tip->threadid, pip->pr_lwpid, lwpname); tip->threadid = 0; /* finish eliminating tid */ if (psp) call_stack(h, psp); else { if (tip->state == TD_THR_ZOMBIE)
*** 410,426 **** static int lwp_call_stack(void *data, const lwpstatus_t *psp, const lwpsinfo_t *pip) { pstack_handle_t *h = data; if (!proc_lwp_in_set(h->lwps, pip->pr_lwpid)) return (0); h->count++; ! tlhead(0, pip->pr_lwpid); if (psp) call_stack(h, psp); else (void) printf("\t** zombie " "(exited, not detached, not yet joined) **\n"); --- 416,436 ---- static int lwp_call_stack(void *data, const lwpstatus_t *psp, const lwpsinfo_t *pip) { + char lwpname[THREAD_NAME_MAX] = ""; pstack_handle_t *h = data; if (!proc_lwp_in_set(h->lwps, pip->pr_lwpid)) return (0); h->count++; ! (void) Plwp_getname(h->proc, pip->pr_lwpid, ! lwpname, sizeof (lwpname)); ! ! tlhead(0, pip->pr_lwpid, lwpname); if (psp) call_stack(h, psp); else (void) printf("\t** zombie " "(exited, not detached, not yet joined) **\n");
*** 460,470 **** tip->threadid = 0; if ((tid = tip->threadid) != 0) { (void) memcpy(lwpstatus.pr_reg, tip->regs, sizeof (prgregset_t)); ! tlhead(tid, tip->lwpid); if (tip->state == TD_THR_ZOMBIE) print_zombie(Pr, tip); else call_stack(h, &lwpstatus); } --- 470,480 ---- tip->threadid = 0; if ((tid = tip->threadid) != 0) { (void) memcpy(lwpstatus.pr_reg, tip->regs, sizeof (prgregset_t)); ! tlhead(tid, tip->lwpid, NULL); if (tip->state == TD_THR_ZOMBIE) print_zombie(Pr, tip); else call_stack(h, &lwpstatus); }
*** 473,499 **** } } return (0); } static void ! tlhead(id_t threadid, id_t lwpid) { if (threadid == 0 && lwpid == 0) return; ! (void) printf("-----------------"); ! if (threadid && lwpid) ! (void) printf(" lwp# %d / thread# %d ", ! (int)lwpid, (int)threadid); ! else if (threadid) ! (void) printf("--------- thread# %d ", (int)threadid); ! else if (lwpid) ! (void) printf(" lwp# %d ------------", (int)lwpid); ! (void) printf("--------------------\n"); } /*ARGSUSED*/ static int print_java_frame(void *cld, prgregset_t gregs, const char *name, int bci, --- 483,535 ---- } } return (0); } + /* The width of the header */ + #define HEAD_WIDTH (62) static void ! tlhead(id_t threadid, id_t lwpid, const char *name) { + char buf[128] = { 0 }; + char num[16]; + ssize_t amt = 0; + int i; + if (threadid == 0 && lwpid == 0) return; ! if (lwpid > 0) { ! (void) snprintf(num, sizeof (num), "%d", (int)lwpid); ! (void) strlcat(buf, "thread# ", sizeof (buf)); ! (void) strlcat(buf, num, sizeof (buf)); ! } ! if (threadid > 0) { ! (void) snprintf(num, sizeof (num), "%d", (int)threadid); ! if (lwpid > 0) ! (void) strlcat(buf, " / ", sizeof (buf)); ! (void) strlcat(buf, "lwp# ", sizeof (buf)); ! (void) strlcat(buf, num, sizeof (buf)); ! } ! if (name != NULL && strlen(name) > 0) { ! (void) strlcat(buf, " [", sizeof (buf)); ! (void) strlcat(buf, name, sizeof (buf)); ! (void) strlcat(buf, "]", sizeof (buf)); ! } ! ! amt = (HEAD_WIDTH - strlen(buf) - 2); ! if (amt < 4) ! amt = 4; ! ! for (i = 0; i < amt / 2; i++) ! (void) putc('-', stdout); ! (void) printf(" %s ", buf); ! for (i = 0; i < (amt / 2) + (amt % 2); i++) ! (void) putc('-', stdout); ! (void) putc('\n', stdout); } /*ARGSUSED*/ static int print_java_frame(void *cld, prgregset_t gregs, const char *name, int bci,