summaryrefslogtreecommitdiffstats
path: root/sys/kern/kern_time.c
diff options
context:
space:
mode:
authordavidxu <davidxu@FreeBSD.org>2008-01-18 13:00:28 +0000
committerdavidxu <davidxu@FreeBSD.org>2008-01-18 13:00:28 +0000
commitae86af8218f9798ff70696ccc00d8f840fe386e0 (patch)
tree46bd7a3432a6e78987dacf3e697839649a862436 /sys/kern/kern_time.c
parentba4fb8ac52b3b401d72c452359c6c3353af7013a (diff)
downloadFreeBSD-src-ae86af8218f9798ff70696ccc00d8f840fe386e0.zip
FreeBSD-src-ae86af8218f9798ff70696ccc00d8f840fe386e0.tar.gz
Make sure reading td_runtime in critical section since thread may be
preempted and td_runtime will be modified.
Diffstat (limited to 'sys/kern/kern_time.c')
-rw-r--r--sys/kern/kern_time.c3
1 files changed, 2 insertions, 1 deletions
diff --git a/sys/kern/kern_time.c b/sys/kern/kern_time.c
index 6df10fa..366da9d 100644
--- a/sys/kern/kern_time.c
+++ b/sys/kern/kern_time.c
@@ -247,8 +247,9 @@ kern_clock_gettime(struct thread *td, clockid_t clock_id, struct timespec *ats)
critical_enter();
switchtime = PCPU_GET(switchtime);
curtime = cpu_ticks();
+ runtime = td->td_runtime;
critical_exit();
- runtime = cputick2usec(td->td_runtime + curtime - switchtime);
+ runtime = cputick2usec(runtime + curtime - switchtime);
ats->tv_sec = runtime / 1000000;
ats->tv_nsec = runtime % 1000000 * 1000;
break;
OpenPOWER on IntegriCloud