• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  *   This program is free software;  you can redistribute it and/or modify
3  *   it under the terms of the GNU General Public License as published by
4  *   the Free Software Foundation; either version 2 of the License, or
5  *   (at your option) any later version.
6  *
7  *   This program is distributed in the hope that it will be useful,
8  *   but WITHOUT ANY WARRANTY;  without even the implied warranty of
9  *   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
10  *   the GNU General Public License for more details.
11  *
12  *   You should have received a copy of the GNU General Public License
13  *   along with this program;  if not, write to the Free Software
14  *   Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
15  */
16 
17 /*
18  * NAME
19  *	gettimeofday02.c
20  *
21  * DESCRIPTION
22  *	Check if gettimeofday is monotonous
23  *
24  * ALGORITHM
25  *	Call gettimeofday() to get a t1 (fist value)
26  *	call it again to get t2, see if t2 < t1, set t2 = t1, repeat for 30 sec
27  *
28  * USAGE:  <for command-line>
29  *  gettimeofday02 [-c n] [-e] [-i n] [-I x] [-P x] [-t]
30  *     where,  -c n : Run n copies concurrently.
31  *             -e   : Turn on errno logging.
32  *             -i n : Execute test n times.
33  *             -I x : Execute test for x seconds.
34  *             -P x : Pause for x seconds between iterations.
35  *             -t   : Turn on syscall timing.
36  *             -T   : Seconds to test gettimeofday (default 30)
37  *
38  * HISTORY
39  *	05/2002 Written by Andi Kleen
40  *
41  */
42 
43 #include <stdint.h>
44 #include <stdio.h>
45 #include <sys/time.h>
46 #include <signal.h>
47 #include <stdlib.h>
48 #include "test.h"
49 #include <sys/syscall.h>
50 #include <unistd.h>
51 #include <time.h>
52 #include <errno.h>
53 
54 #define gettimeofday(a,b)  syscall(__NR_gettimeofday,a,b)
55 
56 char *TCID = "gettimeofday02";
57 int TST_TOTAL = 1;
58 
59 int Tflag;
60 char *tlen = "30";
61 
62 sig_atomic_t done;
63 
64 option_t opts[] = { {"T:", &Tflag, &tlen}, {} };
65 
breakout(int sig)66 void breakout(int sig)
67 {
68 	done = 1;
69 }
70 
cleanup(void)71 void cleanup(void)
72 {
73 }
74 
help(void)75 void help(void)
76 {
77 	printf("  -T len  seconds to test gettimeofday (default %s)\n", tlen);
78 }
79 
main(int ac,char ** av)80 int main(int ac, char **av)
81 {
82 	struct timeval tv1, tv2;
83 
84 	tst_parse_opts(ac, av, opts, help);
85 
86 	tst_sig(NOFORK, DEF_HANDLER, cleanup);
87 	TEST_PAUSE;
88 
89 	tst_resm(TINFO, "checking if gettimeofday is monotonous, takes %ss",
90 		 tlen);
91 	signal(SIGALRM, breakout);
92 	alarm(atoi(tlen));
93 
94 	if (gettimeofday(&tv1, NULL) != 0)
95 		tst_brkm(TBROK, cleanup, "first gettimeofday() failed: %s\n",
96 			 strerror(errno));
97 	while (!done) {
98 		if (gettimeofday(&tv2, NULL) != 0)
99 			tst_brkm(TBROK, cleanup,
100 				 "loop gettimeofday() failed: %s\n",
101 				 strerror(errno));
102 
103 		if (tv2.tv_sec < tv1.tv_sec ||
104 		    (tv2.tv_sec == tv1.tv_sec && tv2.tv_usec < tv1.tv_usec)) {
105 			tst_resm(TFAIL,
106 				 "Time is going backwards: old %jd.%jd vs new %jd.%jd!",
107 				 (intmax_t) tv1.tv_sec, (intmax_t) tv1.tv_usec,
108 				 (intmax_t) tv2.tv_sec, (intmax_t) tv2.tv_usec);
109 			cleanup();
110 			return 1;
111 		}
112 
113 		tv1 = tv2;
114 	}
115 
116 	tst_resm(TPASS, "gettimeofday monotonous in %s seconds", tlen);
117 
118 	cleanup();
119 	tst_exit();
120 }
121