mirror of
https://github.com/freebsd/freebsd-src.git
synced 2024-12-04 03:49:02 +00:00
Fixed runtime accounting. The time since the previous context switch
was discarded on every call to calcru(). Hacking on the `switchtime' global for a related fix in rev.1.38 of kern_resource.c was too fragile and broke when p_switchtime went away. PR: 10402
This commit is contained in:
parent
40969e381b
commit
56ce1a8dc4
Notes:
svn2git
2020-12-20 02:59:44 +00:00
svn path=/head/; revision=44673
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_exit.c 8.7 (Berkeley) 2/12/94
|
||||
* $Id: kern_exit.c,v 1.75 1999/02/19 14:25:34 luoqi Exp $
|
||||
* $Id: kern_exit.c,v 1.76 1999/03/02 00:28:08 julian Exp $
|
||||
*/
|
||||
|
||||
#include "opt_compat.h"
|
||||
@ -303,6 +303,15 @@ exit1(p, rv)
|
||||
calcru(p, &p->p_ru->ru_utime, &p->p_ru->ru_stime, NULL);
|
||||
ruadd(p->p_ru, &p->p_stats->p_cru);
|
||||
|
||||
/*
|
||||
* Pretend that an mi_switch() to the next process occurs now. We
|
||||
* must set `switchtime' directly since we will call cpu_switch()
|
||||
* directly. Set it now so that the rest of the exit time gets
|
||||
* counted somewhere if possible.
|
||||
*/
|
||||
microuptime(&switchtime);
|
||||
switchticks = ticks;
|
||||
|
||||
/*
|
||||
* Notify parent that we're gone. If parent has the P_NOCLDWAIT
|
||||
* flag set, notify process 1 instead (and hope it will handle
|
||||
|
@ -36,7 +36,7 @@
|
||||
* SUCH DAMAGE.
|
||||
*
|
||||
* @(#)kern_resource.c 8.5 (Berkeley) 1/21/94
|
||||
* $Id: kern_resource.c,v 1.42 1999/02/28 10:53:29 bde Exp $
|
||||
* $Id: kern_resource.c,v 1.43 1999/03/05 16:38:12 bde Exp $
|
||||
*/
|
||||
|
||||
#include "opt_compat.h"
|
||||
@ -525,17 +525,6 @@ calcru(p, up, sp, ip)
|
||||
microuptime(&tv);
|
||||
totusec += (tv.tv_usec - switchtime.tv_usec) +
|
||||
(tv.tv_sec - switchtime.tv_sec) * (int64_t)1000000;
|
||||
|
||||
/*
|
||||
* Copy the time that was just read to `switchtime' in case
|
||||
* we are being called from exit1(). Exits don't go through
|
||||
* mi_switch(), so `switchtime' doesn't get set in the normal
|
||||
* way. We set it here instead of more cleanly in exit1()
|
||||
* to avoid losing track of the time between the calls to
|
||||
* microuptime(). Similarly for `switchticks'.
|
||||
*/
|
||||
switchtime = tv;
|
||||
switchticks = ticks;
|
||||
}
|
||||
if (totusec < 0) {
|
||||
/* XXX no %qd in kernel. Truncate. */
|
||||
|
Loading…
Reference in New Issue
Block a user