From owner-freebsd-bugs Thu Jun 1 10:20:20 2000 Delivered-To: freebsd-bugs@freebsd.org Received: from freefall.freebsd.org (freefall.FreeBSD.ORG [204.216.27.21]) by hub.freebsd.org (Postfix) with ESMTP id 3CB6737B5E8 for ; Thu, 1 Jun 2000 10:20:12 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: (from gnats@localhost) by freefall.freebsd.org (8.9.3/8.9.2) id KAA09469; Thu, 1 Jun 2000 10:20:12 -0700 (PDT) (envelope-from gnats@FreeBSD.org) Received: from salmon.maths.tcd.ie (salmon.maths.tcd.ie [134.226.81.11]) by hub.freebsd.org (Postfix) with SMTP id 4C8FF37B5E8 for ; Thu, 1 Jun 2000 10:14:57 -0700 (PDT) (envelope-from dwmalone@maths.tcd.ie) Received: from gosset.maths.tcd.ie by salmon.maths.tcd.ie with SMTP id ; 1 Jun 2000 18:14:56 +0100 (BST) Message-Id: <200006011814.aa18661@gosset.maths.tcd.ie> Date: Thu, 1 Jun 2000 18:14:56 +0100 (BST) From: dwmalone@maths.tcd.ie Reply-To: dwmalone@maths.tcd.ie To: FreeBSD-gnats-submit@freebsd.org X-Send-Pr-Version: 3.2 Subject: bin/18951: top sorting error Sender: owner-freebsd-bugs@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.org >Number: 18951 >Category: bin >Synopsis: top sorting error >Confidential: no >Severity: non-critical >Priority: medium >Responsible: freebsd-bugs >State: open >Quarter: >Keywords: >Date-Required: >Class: sw-bug >Submitter-Id: current-users >Arrival-Date: Thu Jun 01 10:20:01 PDT 2000 >Closed-Date: >Last-Modified: >Originator: David Malone >Release: FreeBSD 3.4-STABLE i386 >Organization: School of Mathematics, Trinity College, Dublin, Ireland. >Environment: 3-STABLE >Description: Top can incorrectly sort things, as many of it assumes things will fit into an int. One of these was fixed by bde in -current, but the fix didn't make it back to stable. >How-To-Repeat: Start top and then use "o time". Sometimes the processes will be out of order. >Fix: Either MFC 1.28, or the following patch would future proof top, at the cost of a few CPU cycles. (for /usr/src/usr.bin/top/machine.h) --- machine.c.orig Fri Mar 24 19:57:36 2000 +++ machine.c Fri Mar 24 19:58:17 2000 @@ -737,26 +737,26 @@ 4 /* stop */ }; +#define CMP(a,b) ( (a) == (b) ? 0 : (a) < (b) ? -1 : 1 ) #define ORDERKEY_PCTCPU \ - if (lresult = (long) PP(p2, p_pctcpu) - (long) PP(p1, p_pctcpu), \ - (result = lresult > 0 ? 1 : lresult < 0 ? -1 : 0) == 0) + if ((result = CMP(PP(p2, p_pctcpu),PP(p1, p_pctcpu))) == 0) #define ORDERKEY_CPTICKS \ - if ((result = PP(p2, p_runtime) - PP(p1, p_runtime)) == 0) + if ((result = CMP(PP(p2, p_runtime),PP(p1, p_runtime))) == 0) #define ORDERKEY_STATE \ - if ((result = sorted_state[(unsigned char) PP(p2, p_stat)] - \ - sorted_state[(unsigned char) PP(p1, p_stat)]) == 0) + if ((result = CMP(sorted_state[(unsigned char) PP(p2, p_stat)], \ + sorted_state[(unsigned char) PP(p1, p_stat)])) == 0) #define ORDERKEY_PRIO \ - if ((result = PP(p2, p_priority) - PP(p1, p_priority)) == 0) + if ((result = CMP(PP(p2, p_priority),PP(p1, p_priority))) == 0) #define ORDERKEY_RSSIZE \ - if ((result = VP(p2, vm_rssize) - VP(p1, vm_rssize)) == 0) + if ((result = CMP(VP(p2, vm_rssize),VP(p1, vm_rssize))) == 0) #define ORDERKEY_MEM \ - if ( (result = PROCSIZE(p2) - PROCSIZE(p1)) == 0 ) + if ((result = CMP(PROCSIZE(p2),PROCSIZE(p1))) == 0 ) /* compare_cpu - the comparison function for sorting by cpu percentage */ @@ -774,7 +774,6 @@ register struct kinfo_proc *p1; register struct kinfo_proc *p2; register int result; - register pctcpu lresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; @@ -816,7 +815,6 @@ register struct kinfo_proc *p1; register struct kinfo_proc *p2; register int result; - register pctcpu lresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; @@ -845,7 +843,6 @@ register struct kinfo_proc *p1; register struct kinfo_proc *p2; register int result; - register pctcpu lresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; @@ -874,7 +871,6 @@ register struct kinfo_proc *p1; register struct kinfo_proc *p2; register int result; - register pctcpu lresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; @@ -903,7 +899,6 @@ register struct kinfo_proc *p1; register struct kinfo_proc *p2; register int result; - register pctcpu lresult; /* remove one level of indirection */ p1 = *(struct kinfo_proc **) pp1; >Release-Note: >Audit-Trail: >Unformatted: To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-bugs" in the body of the message