Allow using things that were deprecated in gtk+-3.22.
[freeciv.git] / m4 / gettimeofday.m4
bloba0601c4b79cc92c5aa76d650c80c1abc86cd7dac
1 dnl FC_CHECK_GETTIMEOFDAY_RUNTIME(EXTRA-LIBS, ACTION-IF-FOUND, ACTION-IF-NOT-FOUND)
2 dnl
3 dnl This tests whether gettimeofday works at runtime.  Here, "works"
4 dnl means: time doesn't go backward and time doesn't jump forward by
5 dnl a huge amount. It seems that glibc 2.3.1 is broken in this respect.
7 AC_DEFUN([FC_CHECK_GETTIMEOFDAY_RUNTIME],
9 templibs="$LIBS"
10 LIBS="$1 $LIBS"
11 AC_RUN_IFELSE([AC_LANG_SOURCE([[
12 #include <sys/time.h>
13 #include <unistd.h>
14 #include <stdio.h>
15 #include <time.h>
16 #include <stdlib.h>
18 #define VERBOSE 0
19 #define SECONDS 3
21 int main(int argc, char **argv)
23   struct timeval tv[2], start, end;
24   int calls;
26   if (gettimeofday(&start, NULL) == -1) {
27     return 1;
28   }
29   end = start;
30   end.tv_sec += SECONDS;
32   tv[0] = start;
33   tv[1] = start;
35   for (calls = 0;; calls++) {
36     time_t sec;
38     if (gettimeofday(&tv[0], NULL) == -1) {
39       return 1;
40     }
42     if (tv[0].tv_sec < tv[1].tv_sec) {
43 #if VERBOSE
44       double diff =
45           (tv[1].tv_sec - start.tv_sec) +
46           ((tv[1].tv_usec - start.tv_usec) / 1e6);
47       printf("after %fs: going backward by %lds\n", diff,
48              tv[1].tv_sec - tv[0].tv_sec);
49 #endif
50       return 1;
51     }
53     if (tv[0].tv_sec == tv[1].tv_sec && tv[0].tv_usec < tv[1].tv_usec) {
54 #if VERBOSE
55       double diff =
56           (tv[1].tv_sec - start.tv_sec) +
57           ((tv[1].tv_usec - start.tv_usec) / 1e6);
58       printf("after %fs: going backward by %ldus\n", diff,
59              tv[1].tv_usec - tv[0].tv_usec);
60 #endif
61       return 1;
62     }
64     if (tv[0].tv_sec > tv[1].tv_sec + 1) {
65 #if VERBOSE
66       double diff =
67           (tv[1].tv_sec - start.tv_sec) +
68           ((tv[1].tv_usec - start.tv_usec) / 1e6);
69       printf("after %fs: going forward by %lds\n", diff,
70              tv[0].tv_sec - tv[1].tv_sec);
71 #endif
72       return 1;
73     }
75     sec = time(NULL);
77     if (abs(sec - tv[0].tv_sec) > 1) {
78 #if VERBOSE
79       double diff =
80           (tv[1].tv_sec - start.tv_sec) +
81           ((tv[1].tv_usec - start.tv_usec) / 1e6);
82       printf("after %fs: time() = %ld, gettimeofday = %ld, diff = %ld\n", diff,
83              (long)sec, (long)tv[0].tv_sec, sec - (long)tv[0].tv_sec);
84 #endif
85       return 1;
86     }
88     if (timercmp(&tv[0], &end, >)) {
89       break;
90     }
91     tv[1] = tv[0];
92   }
94 #if VERBOSE
95   {
96     double diff =
97         (tv[1].tv_sec - start.tv_sec) +
98         ((tv[1].tv_usec - start.tv_usec) / 1e6);
99     printf("%d calls in %fs = %fus/call\n", calls, diff, 1e6 * diff / calls);
100   }
101 #endif
102   return 0;
104 ]])],[AC_MSG_RESULT(yes)
105   [$2]],[AC_MSG_RESULT(no)
106   [$3]],[AC_MSG_RESULT(unknown: cross-compiling)
107   [$3]])
108 LIBS="$templibs"