From b2a2705df4b17480a0983db9a1748bded0324007 Mon Sep 17 00:00:00 2001 From: Kurtis Rader Date: Fri, 24 Jun 2016 19:25:48 -0700 Subject: croak if gettimeofday() fails There is no conceivable way in which timef()'s invocation of gettimeofday() can fail where it makes sense to continue running. Yes, one such, legitimate, failure mode is a 32-bit kernel and the date is greater than 2038-01-19 03:14:07. If you're running a fish binary on such a system it's time to upgrade. Otherwise, either the hardware or OS is broken. Fixes #3167. --- src/common.cpp | 16 +++++----------- src/common.h | 3 +-- 2 files changed, 6 insertions(+), 13 deletions(-) diff --git a/src/common.cpp b/src/common.cpp index 146f0780..cc601460 100644 --- a/src/common.cpp +++ b/src/common.cpp @@ -1648,19 +1648,13 @@ void format_size_safe(char buff[128], unsigned long long sz) { } } +/// Return the number of seconds from the UNIX epoch, with subsecond precision. This function uses +/// the gettimeofday function and will have the same precision as that function. double timef() { struct timeval tv; - int time_res = gettimeofday(&tv, 0); - - if (time_res) { - // Fixme: What on earth is the correct parameter value for NaN? The man pages and the - // standard helpfully state that this parameter is implementation defined. Gcc gives a - // warning if a null pointer is used. But not even all mighty Google gives a hint to what - // value should actually be returned. - return nan(""); - } - - return (double)tv.tv_sec + 0.000001 * tv.tv_usec; + VOMIT_ON_FAILURE(gettimeofday(&tv, 0)); + // return (double)tv.tv_sec + 0.000001 * tv.tv_usec; + return (double)tv.tv_sec + 1e-6 * tv.tv_usec; } void exit_without_destructors(int code) { _exit(code); } diff --git a/src/common.h b/src/common.h index 85b2dcc6..3c2416f6 100644 --- a/src/common.h +++ b/src/common.h @@ -744,8 +744,7 @@ int create_directory(const wcstring &d); void bugreport(); /// Return the number of seconds from the UNIX epoch, with subsecond precision. This function uses -/// the gettimeofday function, and will have the same precision as that function. If an error -/// occurs, NAN is returned. +/// the gettimeofday function and will have the same precision as that function. double timef(); /// Call the following function early in main to set the main thread. This is our replacement for -- cgit v1.2.3