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,