Blame view

3rdparty/c-ares-1.18.1/src/lib/ares__timeval.c 3.04 KB
73ef4ff3   Hu Chunming   提交三方库
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
  
  /* Copyright (C) 2008 by Daniel Stenberg et al
   *
   * Permission to use, copy, modify, and distribute this software and its
   * documentation for any purpose and without fee is hereby granted, provided
   * that the above copyright notice appear in all copies and that both that
   * copyright notice and this permission notice appear in supporting
   * documentation, and that the name of M.I.T. not be used in advertising or
   * publicity pertaining to distribution of the software without specific,
   * written prior permission.  M.I.T. makes no representations about the
   * suitability of this software for any purpose.  It is provided "as is"
   * without express or implied warranty.
   */
  
  #include "ares_setup.h"
  #include "ares.h"
  #include "ares_private.h"
  
  #if defined(WIN32) && !defined(MSDOS)
  
  struct timeval ares__tvnow(void)
  {
    /*
    ** GetTickCount() is available on _all_ Windows versions from W95 up
    ** to nowadays. Returns milliseconds elapsed since last system boot,
    ** increases monotonically and wraps once 49.7 days have elapsed.
    */
    struct timeval now;
    DWORD milliseconds = GetTickCount();
    now.tv_sec = milliseconds / 1000;
    now.tv_usec = (milliseconds % 1000) * 1000;
    return now;
  }
  
  #elif defined(HAVE_CLOCK_GETTIME_MONOTONIC)
  
  struct timeval ares__tvnow(void)
  {
    /*
    ** clock_gettime() is granted to be increased monotonically when the
    ** monotonic clock is queried. Time starting point is unspecified, it
    ** could be the system start-up time, the Epoch, or something else,
    ** in any case the time starting point does not change once that the
    ** system has started up.
    */
    struct timeval now;
    struct timespec tsnow;
    if(0 == clock_gettime(CLOCK_MONOTONIC, &tsnow)) {
      now.tv_sec = tsnow.tv_sec;
      now.tv_usec = tsnow.tv_nsec / 1000;
    }
    /*
    ** Even when the configure process has truly detected monotonic clock
    ** availability, it might happen that it is not actually available at
    ** run-time. When this occurs simply fallback to other time source.
    */
  #ifdef HAVE_GETTIMEOFDAY
    else
      (void)gettimeofday(&now, NULL);  /* LCOV_EXCL_LINE */
  #else
    else {
      now.tv_sec = (long)time(NULL);
      now.tv_usec = 0;
    }
  #endif
    return now;
  }
  
  #elif defined(HAVE_GETTIMEOFDAY)
  
  struct timeval ares__tvnow(void)
  {
    /*
    ** gettimeofday() is not granted to be increased monotonically, due to
    ** clock drifting and external source time synchronization it can jump
    ** forward or backward in time.
    */
    struct timeval now;
    (void)gettimeofday(&now, NULL);
    return now;
  }
  
  #else
  
  struct timeval ares__tvnow(void)
  {
    /*
    ** time() returns the value of time in seconds since the Epoch.
    */
    struct timeval now;
    now.tv_sec = (long)time(NULL);
    now.tv_usec = 0;
    return now;
  }
  
  #endif
  
  #if 0 /* Not used */
  /*
   * Make sure that the first argument is the more recent time, as otherwise
   * we'll get a weird negative time-diff back...
   *
   * Returns: the time difference in number of milliseconds.
   */
  long ares__tvdiff(struct timeval newer, struct timeval older)
  {
    return (newer.tv_sec-older.tv_sec)*1000+
      (newer.tv_usec-older.tv_usec)/1000;
  }
  #endif