/* Portable timers.
- Copyright (C) 2005-2006 Free Software Foundation, Inc.
+ Copyright (C) 2005, 2006, 2007, 2008, 2009, 2010, 2011 Free Software
+ Foundation, Inc.
This file is part of GNU Wget.
You should have received a copy of the GNU General Public License
along with Wget. If not, see <http://www.gnu.org/licenses/>.
-In addition, as a special exception, the Free Software Foundation
-gives permission to link the code of its release of Wget with the
-OpenSSL project's "OpenSSL" library (or with modified versions of it
-that use the same license as the "OpenSSL" library), and distribute
-the linked executables. You must obey the GNU General Public License
-in all respects for all of the code used other than "OpenSSL". If you
-modify this file, you may extend this exception to your version of the
-file, but you are not obligated to do so. If you do not wish to do
-so, delete this exception statement from your version. */
+Additional permission under GNU GPL version 3 section 7
+
+If you modify this program, or any covered work, by linking or
+combining it with the OpenSSL project's OpenSSL library (or a
+modified version of that library), containing parts covered by the
+terms of the OpenSSL or SSLeay licenses, the Free Software Foundation
+grants you additional permission to convey the resulting work.
+Corresponding Source for a non-source form of such a combination
+shall include the source code for the parts of OpenSSL used as well
+as that of the covered work. */
/* This file implements "portable timers" (ptimers), objects that
measure elapsed time using the primitives most appropriate for the
ptimer_new -- creates a timer.
ptimer_reset -- resets the timer's elapsed time to zero.
ptimer_measure -- measure and return the time elapsed since
- creation or last reset.
+ creation or last reset.
ptimer_read -- reads the last measured elapsed value.
ptimer_destroy -- destroy the timer.
ptimer_granularity -- returns the approximate granularity of the timers.
double secs = ptimer_measure ();
printf ("The loop took %.2fs\n", secs); */
-#include <config.h>
+#include "wget.h"
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <errno.h>
-#ifdef HAVE_UNISTD_H
-# include <unistd.h>
-#endif
+#include <unistd.h>
#include <time.h>
-#ifdef HAVE_SYS_TIME_H
-# include <sys/time.h>
-#endif
+#include <sys/time.h>
/* Cygwin currently (as of 2005-04-08, Cygwin 1.5.14) lacks clock_getres,
but still defines _POSIX_TIMERS! Because of that we simply use the
# include <windows.h>
#endif
-#include "wget.h"
+#include "utils.h"
#include "ptimer.h"
/* Depending on the OS, one and only one of PTIMER_POSIX,
#undef PTIMER_WINDOWS
#if defined(WINDOWS) || defined(__CYGWIN__)
-# define PTIMER_WINDOWS /* use Windows timers */
+# define PTIMER_WINDOWS /* use Windows timers */
#elif _POSIX_TIMERS - 0 > 0
-# define PTIMER_POSIX /* use POSIX timers (clock_gettime) */
+# define PTIMER_POSIX /* use POSIX timers (clock_gettime) */
#else
-# define PTIMER_GETTIMEOFDAY /* use gettimeofday */
+# define PTIMER_GETTIMEOFDAY /* use gettimeofday */
#endif
#ifdef PTIMER_POSIX
#endif
{ CLOCK_REALTIME, NO_SYSCONF_CHECK },
};
- int i;
+ size_t i;
/* Determine the clock we can use. For a clock to be usable, it
must be confirmed with sysconf (where applicable) and with
{
struct timespec r;
if (clocks[i].sysconf_name != NO_SYSCONF_CHECK)
- if (sysconf (clocks[i].sysconf_name) < 0)
- continue; /* sysconf claims this clock is unavailable */
+ if (sysconf (clocks[i].sysconf_name) < 0)
+ continue; /* sysconf claims this clock is unavailable */
if (clock_getres (clocks[i].id, &r) < 0)
- continue; /* clock_getres doesn't work for this clock */
+ continue; /* clock_getres doesn't work for this clock */
posix_clock_id = clocks[i].id;
posix_clock_resolution = (double) r.tv_sec + r.tv_nsec / 1e9;
/* Guard against nonsense returned by a broken clock_getres. */
if (posix_clock_resolution == 0)
- posix_clock_resolution = 1e-3;
+ posix_clock_resolution = 1e-3;
break;
}
if (i == countof (clocks))
{
/* If no clock was found, it means that clock_getres failed for
- the realtime clock. */
+ the realtime clock. */
logprintf (LOG_NOTQUIET, _("Cannot get REALTIME clock frequency: %s\n"),
- strerror (errno));
+ strerror (errno));
/* Use CLOCK_REALTIME, but invent a plausible resolution. */
posix_clock_id = CLOCK_REALTIME;
posix_clock_resolution = 1e-3;
posix_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
{
return ((pst1->tv_sec - pst2->tv_sec)
- + (pst1->tv_nsec - pst2->tv_nsec) / 1e9);
+ + (pst1->tv_nsec - pst2->tv_nsec) / 1e9);
}
static inline double
{
return posix_clock_resolution;
}
-#endif /* PTIMER_POSIX */
+#endif /* PTIMER_POSIX */
#ifdef PTIMER_GETTIMEOFDAY
/* Elapsed time measurement using gettimeofday: system time is held in
gettimeofday_diff (ptimer_system_time *pst1, ptimer_system_time *pst2)
{
return ((pst1->tv_sec - pst2->tv_sec)
- + (pst1->tv_usec - pst2->tv_usec) / 1e6);
+ + (pst1->tv_usec - pst2->tv_usec) / 1e6);
}
static inline double
than 1ms. Assume 100 usecs. */
return 0.1;
}
-#endif /* PTIMER_GETTIMEOFDAY */
+#endif /* PTIMER_GETTIMEOFDAY */
#ifdef PTIMER_WINDOWS
/* Elapsed time measurement on Windows: where high-resolution timers
if (windows_hires_timers)
return 1.0 / windows_hires_freq;
else
- return 10; /* according to MSDN */
+ return 10; /* according to MSDN */
}
-#endif /* PTIMER_WINDOWS */
+#endif /* PTIMER_WINDOWS */
\f
/* The code below this point is independent of timer implementation. */
}
/* Measure the elapsed time since timer creation/reset. This causes
- the timer to internally call clock_gettime (or gettimeofday, etc.)
+ the timer to internally call clock_gettime (or gettimeofday, etc.)
to update its idea of current time. The time is returned, but is
also stored for later access through ptimer_read().