procstat_cs.c (279842) | procstat_cs.c (287486) |
---|---|
1/*- 2 * Copyright (c) 2007 Robert N. M. Watson | 1/*- 2 * Copyright (c) 2007 Robert N. M. Watson |
3 * Copyright (c) 2015 Allan Jude <allanjude@freebsd.org> |
|
3 * All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright 9 * notice, this list of conditions and the following disclaimer. 10 * 2. Redistributions in binary form must reproduce the above copyright --- 7 unchanged lines hidden (view full) --- 18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 24 * SUCH DAMAGE. 25 * | 4 * All rights reserved. 5 * 6 * Redistribution and use in source and binary forms, with or without 7 * modification, are permitted provided that the following conditions 8 * are met: 9 * 1. Redistributions of source code must retain the above copyright 10 * notice, this list of conditions and the following disclaimer. 11 * 2. Redistributions in binary form must reproduce the above copyright --- 7 unchanged lines hidden (view full) --- 19 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 20 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 21 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 22 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 23 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 24 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 25 * SUCH DAMAGE. 26 * |
26 * $FreeBSD: head/usr.bin/procstat/procstat_cs.c 279842 2015-03-10 09:41:48Z scottl $ | 27 * $FreeBSD: head/usr.bin/procstat/procstat_cs.c 287486 2015-09-05 17:02:01Z allanjude $ |
27 */ 28 29#include <sys/param.h> 30#include <sys/cpuset.h> | 28 */ 29 30#include <sys/param.h> 31#include <sys/cpuset.h> |
32#include <sys/sbuf.h> |
|
31#include <sys/sysctl.h> 32#include <sys/user.h> 33 34#include <err.h> 35#include <errno.h> 36#include <libprocstat.h> 37#include <stdio.h> 38#include <stdlib.h> 39#include <string.h> 40 41#include "procstat.h" 42 43void 44procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp) 45{ 46 cpusetid_t cs; 47 cpuset_t mask; 48 struct kinfo_proc *kip; | 33#include <sys/sysctl.h> 34#include <sys/user.h> 35 36#include <err.h> 37#include <errno.h> 38#include <libprocstat.h> 39#include <stdio.h> 40#include <stdlib.h> 41#include <string.h> 42 43#include "procstat.h" 44 45void 46procstat_cs(struct procstat *procstat, struct kinfo_proc *kipp) 47{ 48 cpusetid_t cs; 49 cpuset_t mask; 50 struct kinfo_proc *kip; |
51 struct sbuf *cpusetbuf; |
|
49 unsigned int count, i; 50 int once, twice, lastcpu, cpu; 51 52 if (!hflag) | 52 unsigned int count, i; 53 int once, twice, lastcpu, cpu; 54 55 if (!hflag) |
53 printf("%5s %6s %-16s %-16s %2s %4s %-7s\n", "PID", | 56 xo_emit("{T:/%5s %6s %-16s %-16s %2s %4s %-7s}\n", "PID", |
54 "TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK"); 55 56 kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD, 57 kipp->ki_pid, &count); 58 if (kip == NULL) 59 return; 60 kinfo_proc_sort(kip, count); 61 for (i = 0; i < count; i++) { 62 kipp = &kip[i]; | 57 "TID", "COMM", "TDNAME", "CPU", "CSID", "CPU MASK"); 58 59 kip = procstat_getprocs(procstat, KERN_PROC_PID | KERN_PROC_INC_THREAD, 60 kipp->ki_pid, &count); 61 if (kip == NULL) 62 return; 63 kinfo_proc_sort(kip, count); 64 for (i = 0; i < count; i++) { 65 kipp = &kip[i]; |
63 printf("%5d ", kipp->ki_pid); 64 printf("%6d ", kipp->ki_tid); 65 printf("%-16s ", strlen(kipp->ki_comm) ? | 66 xo_emit("{k:process_id/%5d/%d} ", kipp->ki_pid); 67 xo_emit("{:thread_id/%6d/%d} ", kipp->ki_tid); 68 xo_emit("{:command/%-16s/%s} ", strlen(kipp->ki_comm) ? |
66 kipp->ki_comm : "-"); | 69 kipp->ki_comm : "-"); |
67 printf("%-16s ", (strlen(kipp->ki_tdname) && | 70 xo_emit("{:thread_name/%-16s/%s} ", (strlen(kipp->ki_tdname) && |
68 (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ? 69 kipp->ki_tdname : "-"); 70 if (kipp->ki_oncpu != 255) | 71 (strcmp(kipp->ki_comm, kipp->ki_tdname) != 0)) ? 72 kipp->ki_tdname : "-"); 73 if (kipp->ki_oncpu != 255) |
71 printf("%3d ", kipp->ki_oncpu); | 74 xo_emit("{:cpu/%3d/%d} ", kipp->ki_oncpu); |
72 else if (kipp->ki_lastcpu != 255) | 75 else if (kipp->ki_lastcpu != 255) |
73 printf("%3d ", kipp->ki_lastcpu); | 76 xo_emit("{:cpu/%3d/%d} ", kipp->ki_lastcpu); |
74 else | 77 else |
75 printf("%3s ", "-"); | 78 xo_emit("{:cpu/%3s/%s} ", "-"); |
76 if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, 77 kipp->ki_tid, &cs) != 0) { 78 cs = CPUSET_INVALID; 79 } | 79 if (cpuset_getid(CPU_LEVEL_CPUSET, CPU_WHICH_TID, 80 kipp->ki_tid, &cs) != 0) { 81 cs = CPUSET_INVALID; 82 } |
80 printf("%4d ", cs); | 83 xo_emit("{:cpu_set_id/%4d/%d} ", cs); |
81 if ((cs != CPUSET_INVALID) && 82 (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, 83 kipp->ki_tid, sizeof(mask), &mask) == 0)) { 84 lastcpu = -1; 85 once = 0; 86 twice = 0; | 84 if ((cs != CPUSET_INVALID) && 85 (cpuset_getaffinity(CPU_LEVEL_WHICH, CPU_WHICH_TID, 86 kipp->ki_tid, sizeof(mask), &mask) == 0)) { 87 lastcpu = -1; 88 once = 0; 89 twice = 0; |
90 cpusetbuf = sbuf_new_auto(); |
|
87 for (cpu = 0; cpu < CPU_SETSIZE; cpu++) { 88 if (CPU_ISSET(cpu, &mask)) { 89 if (once == 0) { | 91 for (cpu = 0; cpu < CPU_SETSIZE; cpu++) { 92 if (CPU_ISSET(cpu, &mask)) { 93 if (once == 0) { |
90 printf("%d", cpu); | 94 sbuf_printf(cpusetbuf, "%d", 95 cpu); |
91 once = 1; 92 } else if (cpu == lastcpu + 1) { 93 twice = 1; 94 } else if (twice == 1) { | 96 once = 1; 97 } else if (cpu == lastcpu + 1) { 98 twice = 1; 99 } else if (twice == 1) { |
95 printf("-%d,%d", lastcpu, cpu); | 100 sbuf_printf(cpusetbuf, "-%d,%d", 101 lastcpu, cpu); |
96 twice = 0; 97 } else | 102 twice = 0; 103 } else |
98 printf(",%d", cpu); | 104 sbuf_printf(cpusetbuf, ",%d", 105 cpu); |
99 lastcpu = cpu; 100 } 101 } 102 if (once && twice) | 106 lastcpu = cpu; 107 } 108 } 109 if (once && twice) |
103 printf("-%d", lastcpu); | 110 sbuf_printf(cpusetbuf, "-%d", lastcpu); 111 if (sbuf_finish(cpusetbuf) != 0) 112 xo_err(1, "Could not generate output"); 113 xo_emit("{:cpu_set/%s}", sbuf_data(cpusetbuf)); 114 sbuf_delete(cpusetbuf); |
104 } | 115 } |
105 printf("\n"); | 116 xo_emit("\n"); |
106 } 107 procstat_freeprocs(procstat, kip); 108} | 117 } 118 procstat_freeprocs(procstat, kip); 119} |