svn commit: r210827 - head/games/grdc

Ulrich Spoerlein uqs at FreeBSD.org
Tue Aug 3 20:56:24 UTC 2010


Author: uqs
Date: Tue Aug  3 20:56:23 2010
New Revision: 210827
URL: http://svn.freebsd.org/changeset/base/210827

Log:
  grdc(6): de-obfuscate the timekeeping of now/delay
  
  - 'now' only contains current time readings
  - delay is only used as parameter to nanosleep
  - prev_sec contains the time_t of the previous loop iteration
  
  Submitted by:	bde
  MFC after:	2 weeks

Modified:
  head/games/grdc/grdc.c

Modified: head/games/grdc/grdc.c
==============================================================================
--- head/games/grdc/grdc.c	Tue Aug  3 19:25:58 2010	(r210826)
+++ head/games/grdc/grdc.c	Tue Aug  3 20:56:23 2010	(r210827)
@@ -55,6 +55,7 @@ int
 main(int argc, char *argv[])
 {
 	struct timespec delay;
+	time_t prev_sec;
 	long t, a;
 	int i, j, s, k;
 	int n;
@@ -138,6 +139,7 @@ main(int argc, char *argv[])
 		attrset(COLOR_PAIR(2));
 	}
 	clock_gettime(CLOCK_REALTIME_FAST, &now);
+	prev_sec = now.tv_sec;
 	do {
 		mask = 0;
 		tm = localtime(&now.tv_sec);
@@ -194,20 +196,20 @@ main(int argc, char *argv[])
 		}
 		movto(6, 0);
 		refresh();
-		clock_gettime(CLOCK_REALTIME_FAST, &delay);
-		if (delay.tv_sec == now.tv_sec) {
+		clock_gettime(CLOCK_REALTIME_FAST, &now);
+		if (now.tv_sec == prev_sec) {
 			if (delay.tv_nsec > 0) {
 				delay.tv_sec = 0;
-				delay.tv_nsec = 1000000000 - delay.tv_nsec;
+				delay.tv_nsec = 1000000000 - now.tv_nsec;
 			} else {
 				delay.tv_sec = 1;
 				delay.tv_nsec = 0;
 			}
 			nanosleep(&delay, NULL);
-			clock_gettime(CLOCK_REALTIME_FAST, &delay);
+			clock_gettime(CLOCK_REALTIME_FAST, &now);
 		}
-		n -= delay.tv_sec - now.tv_sec;
-		now.tv_sec = delay.tv_sec;
+		n -= now.tv_sec - prev_sec;
+		prev_sec = now.tv_sec;
 		if (sigtermed) {
 			standend();
 			clear();


More information about the svn-src-head mailing list