Revision
136
Author
robert@fledge.watson.org
Date
2009-11-04 15:11:04 -0800 (Wed, 04 Nov 2009)

Log Message

Refactor time mathematics in _dispatch_timeout_ts() to avoid overflowing
timespec.tv_nsec.

Modified Paths

Diff

Modified: trunk/src/time.c (135 => 136)


--- trunk/src/time.c	2009-11-04 23:10:32 UTC (rev 135)
+++ trunk/src/time.c	2009-11-04 23:11:04 UTC (rev 136)
@@ -194,7 +194,7 @@
 _dispatch_timeout_ts(dispatch_time_t when)
 {
 	struct timespec ts_realtime;
-	uint64_t abstime;
+	uint64_t abstime, realtime;
 	int ret;
 
 	if (when == 0) {
@@ -220,8 +220,10 @@
 	abstime = _dispatch_absolute_time();
 	ret = clock_gettime(CLOCK_REALTIME, &ts_realtime);
 	(void)dispatch_assume_zero(ret);
-	ts_realtime.tv_sec += (when - abstime) / NSEC_PER_SEC;
-	ts_realtime.tv_nsec += (when - abstime) % NSEC_PER_SEC;
+	realtime = ts_realtime.tv_sec * NSEC_PER_SEC + ts_realtime.tv_nsec +
+	    (when - abstime);
+	ts_realtime.tv_sec = realtime / NSEC_PER_SEC;
+	ts_realtime.tv_nsec = realtime % NSEC_PER_SEC;
 	return (ts_realtime);
 }
 #endif