Following the worm(6) bug fix and improvement, make robots(6) do it as well.
Changes: * Replace timeval with timespec structs; * Use clock_gettime(CLOCK_UPTIME) instead of gettimeofday(); * Use timespec*() instead of manual math operations; * Use ppoll() instead of poll() + math operations; No functionality changed, except that with this diff robots(6) won't suffer with clock changes and suspend. ok? Index: extern.c =================================================================== RCS file: /cvs/src/games/robots/extern.c,v retrieving revision 1.6 diff -u -p -r1.6 extern.c --- extern.c 3 Nov 2014 22:14:54 -0000 1.6 +++ extern.c 25 Aug 2015 01:22:36 -0000 @@ -62,7 +62,7 @@ int Score; /* Current score */ int Start_level = 1; /* Level on which to start */ int Wait_bonus; /* bonus for waiting */ -struct timeval tv; /* how long to wait; could be an option */ +struct timespec tv; /* how long to wait; could be an option */ COORD Max; /* Max area robots take up */ COORD Min; /* Min area robots take up */ Index: main.c =================================================================== RCS file: /cvs/src/games/robots/main.c,v retrieving revision 1.19 diff -u -p -r1.19 main.c --- main.c 3 Nov 2014 22:14:54 -0000 1.19 +++ main.c 25 Aug 2015 01:22:53 -0000 @@ -70,7 +70,6 @@ main(int ac, char *av[]) Real_time = TRUE; /* Could be a command-line option */ tv.tv_sec = 3; - tv.tv_usec = 0; break; case 'a': Start_level = 4; Index: move.c =================================================================== RCS file: /cvs/src/games/robots/move.c,v retrieving revision 1.10 diff -u -p -r1.10 move.c --- move.c 3 Nov 2014 22:14:54 -0000 1.10 +++ move.c 25 Aug 2015 02:01:19 -0000 @@ -43,8 +43,7 @@ get_move(void) { int c; int retval; - struct timeval t, tod; - struct timezone tz; + struct timespec t, tn; #ifdef FANCY int lastmove; #endif @@ -61,9 +60,8 @@ get_move(void) } #endif if (Real_time) { - t.tv_sec = tv.tv_sec; - t.tv_usec = tv.tv_usec; - (void)gettimeofday(&tod, &tz); + t = tv; + clock_gettime(CLOCK_UPTIME, &tn); } for (;;) { if (Teleport && must_telep()) @@ -94,8 +92,7 @@ over: pfd[0].fd = STDIN_FILENO; pfd[0].events = POLLIN; - retval = poll(pfd, 1, - t.tv_sec * 1000 + t.tv_usec / 1000); + retval = ppoll(pfd, 1, &t, NULL); if (retval > 0) c = getchar(); else /* Don't move if timed out or error */ @@ -203,15 +200,16 @@ teleport: break; } if (Real_time) { - (void)gettimeofday(&t, &tz); - t.tv_sec = tod.tv_sec + tv.tv_sec - t.tv_sec; - t.tv_usec = tod.tv_usec + tv.tv_usec - t.tv_usec; - if (t.tv_usec < 0) { - t.tv_sec--; - t.tv_usec += 1000000; /* Now it must be > 0 */ - } - if (t.tv_sec < 0) + /* Update current time. */ + clock_gettime(CLOCK_UPTIME, &t); + + /* Check whether tv time has passed. */ + timespecadd(&tn, &tv, &tn); + if (timespeccmp(&tn, &t, <)) goto ret; + + /* Keep the difference otherwise. */ + timespecsub(&tn, &t, &t); } } ret: Index: robots.h =================================================================== RCS file: /cvs/src/games/robots/robots.h,v retrieving revision 1.8 diff -u -p -r1.8 robots.h --- robots.h 16 Nov 2014 04:49:48 -0000 1.8 +++ robots.h 25 Aug 2015 02:04:58 -0000 @@ -107,7 +107,7 @@ extern char Cnt_move, Field[Y_FIELDSIZE] extern int Count, Level, Num_robots, Num_scores, Score, Start_level, Wait_bonus; -extern struct timeval tv; +extern struct timespec tv; extern COORD Max, Min, My_pos, Robots[];