From owner-freebsd-hackers Fri Mar 24 12: 4:29 2000 Delivered-To: freebsd-hackers@freebsd.org Received: from salmon.maths.tcd.ie (salmon.maths.tcd.ie [134.226.81.11]) by hub.freebsd.org (Postfix) with SMTP id 5F82D37B77D for ; Fri, 24 Mar 2000 12:04:23 -0800 (PST) (envelope-from dwmalone@maths.tcd.ie) Received: from bell.maths.tcd.ie by salmon.maths.tcd.ie with SMTP id ; 24 Mar 2000 20:04:21 +0000 (GMT) Date: Fri, 24 Mar 2000 20:04:21 +0000 From: David Malone To: Luke Hollins Cc: freebsd-hackers@freebsd.org Subject: Re: top sorting error Message-ID: <20000324200421.A59323@bell.maths.tcd.ie> References: Mime-Version: 1.0 Content-Type: text/plain; charset=us-ascii X-Mailer: Mutt 1.0.1i In-Reply-To: ; from lwh@pathcom.com on Fri, Mar 24, 2000 at 01:00:54PM -0500 Sender: owner-freebsd-hackers@FreeBSD.ORG Precedence: bulk X-Loop: FreeBSD.ORG On Fri, Mar 24, 2000 at 01:00:54PM -0500, Luke Hollins wrote: > I don't know if this is specific to FreeBSD but I just noticed it when i > picked o time in top: > > PID USERNAME PRI NICE SIZE RES STATE TIME WCPU CPU COMMAND > 79364 root 2 0 2696K 1636K select 8:23 0.00% 0.00% apache > 235 mysql 2 0 13372K 6384K poll 361:14 0.15% 0.15% mysqld It seems to be an overflow problem - top was reilying on things fitting into a int, which were 64 bits long. It looks like someone ran into the problem before for the %cpu field, and fixed it in a different way. This patch below should fix it regardless of the type of the variable. It's for a file in /usr/src/usr.bin/top. David. --- 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; To Unsubscribe: send mail to majordomo@FreeBSD.org with "unsubscribe freebsd-hackers" in the body of the message