From 95c27ab84543d6ba156210ab6d05810088b45bdb Mon Sep 17 00:00:00 2001 From: bde Date: Tue, 7 Nov 2006 10:03:10 +0000 Subject: Second stage of unbreaking thr formatting of the NICE field: decode the priority class and use this to: - print "-" instead of a garbage value for ithreads. Print "-" instead of the unused nice value for kthreads which are (mis)classified as PRI_TIMESHARE. For such threads, the nice value can be set to nonzero by root, but it is never used (at least by the 4bsd scheduler). For ithreads, we didn't even print the unused value. - print "i" and "r" instead of a biased "" for idletime and realtime threads, Here is the priority parameter to idprio/rtprio(1). Just add the prefix and remove the bias for now. has been stored indirectly in the kernel since 2001/02/12, and even the kernel cannot recover the original value in all cases. Here we need to handle more cases than pri_to_rtp(), but actually handle fewer cases, and end up printing garbage after a thread changes its current priority while in the kernel. - for idletime and realtime threads, if they are kthreads then add a prefix of "k" to the previous string. - for idletime and realtime threads, if they in the FIFO scheduling class then add a suffix of "F" to the previous string (if it fits; the other parts of the string are sure to fit unless is garbage). --- usr.bin/top/machine.c | 44 +++++++++++++++++++++++++++++--------------- 1 file changed, 29 insertions(+), 15 deletions(-) (limited to 'usr.bin/top') diff --git a/usr.bin/top/machine.c b/usr.bin/top/machine.c index 92c82fa..d3f9ef0 100644 --- a/usr.bin/top/machine.c +++ b/usr.bin/top/machine.c @@ -800,22 +800,36 @@ getsysctl(const char *name, void *ptr, size_t len) } } -static -const char *format_nice(const struct kinfo_proc *pp) +static const char * +format_nice(const struct kinfo_proc *pp) { - static char nicebuf[5]; - - snprintf(nicebuf, sizeof(nicebuf), "%4d", - /* - * normal time -> nice value -20 - +20 - * real time 0 - 31 -> nice value -52 - -21 - * idle time 0 - 31 -> nice value +21 - +52 - */ - (pp->ki_pri.pri_class == PRI_TIMESHARE ? - pp->ki_nice - NZERO : - (PRI_IS_REALTIME(pp->ki_pri.pri_class) ? - (PRIO_MIN - 1 - (PRI_MAX_REALTIME - pp->ki_pri.pri_level)) : - (PRIO_MAX + 1 + pp->ki_pri.pri_level - PRI_MIN_IDLE)))); + const char *fifo, *kthread; + int rtpri; + static char nicebuf[4 + 1]; + + fifo = PRI_NEED_RR(pp->ki_pri.pri_class) ? "" : "F"; + kthread = (pp->ki_flag & P_KTHREAD) ? "k" : ""; + switch (PRI_BASE(pp->ki_pri.pri_class)) { + case PRI_ITHD: + return ("-"); + case PRI_REALTIME: + rtpri = pp->ki_pri.pri_level - PRI_MIN_REALTIME; + snprintf(nicebuf, sizeof(nicebuf), "%sr%d%s", + kthread, rtpri, fifo); + break; + case PRI_TIMESHARE: + if (pp->ki_flag & P_KTHREAD) + return ("-"); + snprintf(nicebuf, sizeof(nicebuf), "%d", pp->ki_nice - NZERO); + break; + case PRI_IDLE: + rtpri = pp->ki_pri.pri_level - PRI_MIN_IDLE; + snprintf(nicebuf, sizeof(nicebuf), "%si%d%s", + kthread, rtpri, fifo); + break; + default: + return ("?"); + } return (nicebuf); } -- cgit v1.1