Skip to content
  • Mark Harris's avatar
    http: Fix use of deprecated function ftime() · 069dc6e8
    Mark Harris authored
    The ftime() function, introduced in V7 Unix (1979), gets the current
    time in seconds and milliseconds, and time zone information.  It was
    marked as a legacy interface in POSIX.1-2001, and removed altogether
    from POSIX.1-2008.  The gettimeofday() function, originally from
    4.1 BSD, gets the current time in seconds and microseconds, and optional
    time zone information, and was marked as obsolete in POSIX.1-2008
    although it was kept in the standard.  The POSIX recommended function
    for getting time with sub-second resolution is clock_gettime(), which
    was introduced in POSIX.1b-1993 and is now part of the base POSIX
    standard; it supports multiple clocks and nanosecond resolution.
    Additionally the function timespec_get() was introduced in C11 and also
    supports nanosecond resolution.
    
    To support dates beyond the year 2038, glibc and other libraries are
    being updated to support 64-bit time_t even on 32-bit architectures,
    requiring new implementations of interfaces that work with time.  As
    part of this effort, the ftime() function was deprecated in glibc 2.31
    (released February 1, 2020), a warning is now issued when building code
    that uses this function, and removal is planned for a future version of
    glibc (https://sourceware.org/pipermail/libc-announce/2020/000025.html).
    
    ftime() is used in http.c to measure time intervals with millisecond
    resolution.  To avoid the glibc 2.31 deprecation warning and further
    issues when the function is removed entirely from glibc, clock_gettime()
    is now used instead when it is available in the C library, as it is on
    current Linux systems.  Prior to glibc 2.17, clock_gettime() required
    linking with librt; on such systems ftime() will continue to be used, to
    avoid an additional library dependency.  macOS provides clock_gettime()
    starting in macOS 10.12; earlier versions will continue to use ftime().
    Windows provides ftime() but not clock_gettime(), so ftime() will
    continue to be used on Windows.
    
    ftime(), gettimeofday(), and clock_gettime() with the CLOCK_REALTIME
    clock get the "real time", which is subject to jumps if set by an
    administrator or time service.  The CLOCK_MONOTONIC clock does not have
    this problem and is more suitable for measuring time intervals.  On
    Linux, the CLOCK_BOOTTIME clock measures the time since last boot and is
    the same as CLOCK_MONOTONIC except that the Linux CLOCK_MONOTONIC clock
    does not advance when the system is suspended.  Because it is used to
    measure time intervals, CLOCK_BOOTTIME or CLOCK_MONOTONIC are used when
    available, when clock_gettime() is used.  However the only clock
    required by POSIX.1-2008 is CLOCK_REALTIME, so that will be used if the
    other clocks are not available.
    069dc6e8