Commit 1c3c106f authored by Thomas White's avatar Thomas White
Browse files

indexamajig: Add fallback for clock_gettime()

parent cc16ae63
......@@ -18,6 +18,9 @@
/* Define to 1 if Cairo is available */
#undef HAVE_CAIRO
/* Define to 1 if clock_gettime is available. */
#undef HAVE_CLOCK_GETTIME
/* Define to 1 if CL/cl.h should be used */
#undef HAVE_CL_CL_H
......
......@@ -7481,6 +7481,60 @@ fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for clock_gettime in -lrt" >&5
$as_echo_n "checking for clock_gettime in -lrt... " >&6; }
if test "${ac_cv_lib_rt_clock_gettime+set}" = set; then :
$as_echo_n "(cached) " >&6
else
ac_check_lib_save_LIBS=$LIBS
LIBS="-lrt $LIBS"
cat confdefs.h - <<_ACEOF >conftest.$ac_ext
/* end confdefs.h. */
/* Override any GCC internal prototype to avoid an error.
Use char because int might match the return type of a GCC
builtin and then its argument prototype would still apply. */
#ifdef __cplusplus
extern "C"
#endif
char clock_gettime ();
int
main ()
{
return clock_gettime ();
;
return 0;
}
_ACEOF
if ac_fn_c_try_link "$LINENO"; then :
ac_cv_lib_rt_clock_gettime=yes
else
ac_cv_lib_rt_clock_gettime=no
fi
rm -f core conftest.err conftest.$ac_objext \
conftest$ac_exeext conftest.$ac_ext
LIBS=$ac_check_lib_save_LIBS
fi
{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_lib_rt_clock_gettime" >&5
$as_echo "$ac_cv_lib_rt_clock_gettime" >&6; }
if test "x$ac_cv_lib_rt_clock_gettime" = x""yes; then :
$as_echo "#define HAVE_CLOCK_GETTIME 1" >>confdefs.h
TIMER_LIBS="-lrt"
else
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Falling back on gettimeofday()." >&5
$as_echo "$as_me: WARNING: Falling back on gettimeofday()." >&2;}
{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: Time intervals may not be correct in certain circumstances." >&5
$as_echo "$as_me: WARNING: Time intervals may not be correct in certain circumstances." >&2;}
fi
if test x$have_opencl = xtrue; then
HAVE_OPENCL_TRUE=
HAVE_OPENCL_FALSE='#'
......@@ -7574,9 +7628,10 @@ $as_echo "$gl_cv_prog_c_ignore_unused_libraries" >&6; }
CFLAGS="$CFLAGS $HDF5_CFLAGS $GSL_CFLAGS $OPENCL_CFLAGS -pthread $GTK_CFLAGS"
CFLAGS="$CFLAGS $LIBTIFF_CFLAGS -D_GNU_SOURCE $libPNG_CFLAGS $Cairo_CFLAGS"
CFLAGS="$CFLAGS $GDK_pixbuf_CFLAGS $GDK_pixbuf_2_CFLAGS"
LIBS="$LIBS $HDF5_LIBS -lm -lz $GSL_LIBS $GTK_LIBS $OPENCL_LIBS -pthread -lrt"
LIBS="$LIBS $HDF5_LIBS -lm -lz $GSL_LIBS $GTK_LIBS $OPENCL_LIBS -pthread"
LIBS="$LIBS $LIBTIFF_LIBS $libPNG_LIBS $Cairo_LIBS $GDK_pixbuf_LIBS"
LIBS="$LIBS $GDK_pixbuf_2_LIBS $LDFLAGS"
LIBS="$LIBS $GDK_pixbuf_2_LIBS $TIMER_LIBS $LDFLAGS"
......
......@@ -219,6 +219,16 @@ AC_CHECK_LIB([pthread], [sched_setaffinity], [
])
AC_CHECK_LIB([rt], [clock_gettime], [
AC_DEFINE([HAVE_CLOCK_GETTIME], [1],
[Define to 1 if clock_gettime is available.])
TIMER_LIBS="-lrt"
], [
AC_MSG_WARN([Falling back on gettimeofday().])
AC_MSG_WARN([Time intervals may not be correct in certain circumstances.])
])
dnl Conditionals...
AM_CONDITIONAL([HAVE_OPENCL], test x$have_opencl = xtrue)
......@@ -236,9 +246,10 @@ gl_IGNORE_UNUSED_LIBRARIES
CFLAGS="$CFLAGS $HDF5_CFLAGS $GSL_CFLAGS $OPENCL_CFLAGS -pthread $GTK_CFLAGS"
CFLAGS="$CFLAGS $LIBTIFF_CFLAGS -D_GNU_SOURCE $libPNG_CFLAGS $Cairo_CFLAGS"
CFLAGS="$CFLAGS $GDK_pixbuf_CFLAGS $GDK_pixbuf_2_CFLAGS"
LIBS="$LIBS $HDF5_LIBS -lm -lz $GSL_LIBS $GTK_LIBS $OPENCL_LIBS -pthread -lrt"
LIBS="$LIBS $HDF5_LIBS -lm -lz $GSL_LIBS $GTK_LIBS $OPENCL_LIBS -pthread"
LIBS="$LIBS $LIBTIFF_LIBS $libPNG_LIBS $Cairo_LIBS $GDK_pixbuf_LIBS"
LIBS="$LIBS $GDK_pixbuf_2_LIBS $LDFLAGS"
LIBS="$LIBS $GDK_pixbuf_2_LIBS $TIMER_LIBS $LDFLAGS"
GTK_DOC_CHECK([1.11],[--flavour no-tmpl])
......
......@@ -23,7 +23,12 @@
#include <hdf5.h>
#include <gsl/gsl_errno.h>
#include <pthread.h>
#ifdef HAVE_CLOCK_GETTIME
#include <time.h>
#else
#include <sys/time.h>
#endif
#include "utils.h"
#include "hdf5-file.h"
......@@ -401,17 +406,40 @@ static void *get_image(void *qp)
}
#ifdef HAVE_CLOCK_GETTIME
static time_t get_monotonic_seconds()
{
struct timespec tp;
clock_gettime(CLOCK_MONOTONIC, &tp);
return tp.tv_sec;
}
#else
/* Fallback version of the above. The time according to gettimeofday() is not
* monotonic, so measuring intervals based on it will screw up if there's a
* timezone change (e.g. daylight savings) while the program is running. */
static time_t get_monotonic_seconds()
{
struct timeval tp;
gettimeofday(&tp, NULL);
return tp.tv_sec;
}
#endif
static void finalise_image(void *qp, void *pp)
{
struct queue_args *qargs = qp;
struct index_args *pargs = pp;
struct timespec tp;
time_t monotonic_seconds;
qargs->n_indexable += pargs->indexable;
qargs->n_processed++;
clock_gettime(CLOCK_REALTIME, &tp);
if ( tp.tv_sec >= qargs->t_last_stats+STATS_EVERY_N_SECONDS ) {
monotonic_seconds = get_monotonic_seconds();
if ( monotonic_seconds >= qargs->t_last_stats+STATS_EVERY_N_SECONDS ) {
STATUS("%i out of %i indexed so far,"
" %i out of %i since the last message.\n",
......@@ -421,7 +449,7 @@ static void finalise_image(void *qp, void *pp)
qargs->n_processed_last_stats = qargs->n_processed;
qargs->n_indexable_last_stats = qargs->n_indexable;
qargs->t_last_stats = tp.tv_sec;
qargs->t_last_stats = monotonic_seconds;
}
......@@ -475,7 +503,6 @@ int main(int argc, char *argv[])
char *element = NULL;
double nominal_photon_energy;
int stream_flags = STREAM_INTEGRATED;
struct timespec tp;
int cpu_num = 0;
int cpu_groupsize = 1;
int cpu_offset = 0;
......@@ -847,8 +874,7 @@ int main(int argc, char *argv[])
qargs.n_processed = 0;
qargs.n_indexable_last_stats = 0;
qargs.n_processed_last_stats = 0;
clock_gettime(CLOCK_REALTIME, &tp);
qargs.t_last_stats = tp.tv_sec;
qargs.t_last_stats = get_monotonic_seconds();
n_images = run_threads(nthreads, process_image, get_image,
finalise_image, &qargs, 0,
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment