1/* gethrxtime -- get high resolution real time 2 3 Copyright (C) 2005, 2006, 2007, 2009, 2010 Free Software Foundation, Inc. 4 5 This program is free software: you can redistribute it and/or modify 6 it under the terms of the GNU General Public License as published by 7 the Free Software Foundation; either version 3 of the License, or 8 (at your option) any later version. 9 10 This program is distributed in the hope that it will be useful, 11 but WITHOUT ANY WARRANTY; without even the implied warranty of 12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 GNU General Public License for more details. 14 15 You should have received a copy of the GNU General Public License 16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 17 18/* Written by Paul Eggert. */ 19 20#include <config.h> 21 22#include "gethrxtime.h" 23 24#include <sys/time.h> 25#include "timespec.h" 26 27/* Get the current time, as a count of the number of nanoseconds since 28 an arbitrary epoch (e.g., the system boot time). Prefer a 29 high-resolution clock that is not subject to resetting or 30 drifting. */ 31 32xtime_t 33gethrxtime (void) 34{ 35#if HAVE_NANOUPTIME 36 { 37 struct timespec ts; 38 nanouptime (&ts); 39 return xtime_make (ts.tv_sec, ts.tv_nsec); 40 } 41#else 42 43# if defined CLOCK_MONOTONIC && HAVE_CLOCK_GETTIME 44 { 45 struct timespec ts; 46 if (clock_gettime (CLOCK_MONOTONIC, &ts) == 0) 47 return xtime_make (ts.tv_sec, ts.tv_nsec); 48 } 49# endif 50 51# if HAVE_MICROUPTIME 52 { 53 struct timeval tv; 54 microuptime (&tv); 55 return xtime_make (tv.tv_sec, 1000 * tv.tv_usec); 56 } 57 58# else 59 /* No monotonically increasing clocks are available; fall back on a 60 clock that might jump backwards, since it's the best we can do. */ 61 { 62 struct timespec ts; 63 gettime (&ts); 64 return xtime_make (ts.tv_sec, ts.tv_nsec); 65 } 66# endif 67#endif 68} 69