From: mquinson Date: Mon, 22 Mar 2010 16:29:22 +0000 (+0000) Subject: Use nanosecond timers if found X-Git-Tag: SVN~441 X-Git-Url: http://info.iut-bm.univ-fcomte.fr/pub/gitweb/simgrid.git/commitdiff_plain/04cb78f32377e433ce4d2d152e03a68c32c42fd0 Use nanosecond timers if found git-svn-id: svn+ssh://scm.gforge.inria.fr/svn/simgrid/simgrid/trunk@7298 48e7efb5-ca39-0410-a469-dd3cf9ba447f --- diff --git a/configure.ac b/configure.ac index 4e693038e2..2f9d91fe70 100644 --- a/configure.ac +++ b/configure.ac @@ -32,6 +32,11 @@ dnl We do build a proper DLL when using win32 AC_LIBTOOL_WIN32_DLL AC_PROG_LIBTOOL +SIMGRID_DEP="" +SMPI_DEP="" +GRAS_DEP="" + + ############### ## SVN version check ## @@ -71,7 +76,7 @@ AC_CHECK_FUNCS([gettimeofday usleep \ sysconf\ readv\ popen\ - signal]) + signal]) dnl GNU systems before POSIX2008 need the _GNU_SOURCE definition to find getline (and simgrid does pass this) AC_MSG_CHECKING(a usable getline) @@ -91,7 +96,14 @@ AC_LINK_IFELSE([ AC_DEFINE(SIMGRID_NEED_GETLINE, 1, enable the getline replacement) AC_MSG_RESULT(not found (activating internal implementation)) ]) - + +dnl AC_MSG_CHECKING(POSIX timer functions) +AC_CHECK_LIB(rt, [clock_gettime], [ + AC_DEFINE(HAVE_POSIX_GETTIME, 1, POSIX timer functions were found) + SIMGRID_DEP="$SIMGRID_DEP -lrt" + GRAS_DEP="$GRAS_DEP -lrt" + ]) + # check for a working snprintf (or use xbt/snprintf.c, which comes from http://www.ijs.si/software/snprintf/) AC_FUNC_SNPRINTF # check for asprintf function familly (or request the replacements from xbt/snprintf.c) @@ -273,19 +285,15 @@ fi SG_CONFIGURE_PART(Checking extra libraries dependencies...) -SIMGRID_DEP="" -SMPI_DEP="" -GRAS_DEP="" - if test xpthread=xyes ; then # if the pthreads are usable if test "x$with_context" = "xpthread" ; then # if we use them to implement the xbt_context - SIMGRID_DEP="-lpthread" + SIMGRID_DEP="$SIMGRID_DEP -lpthread" fi # we need them in any case for the gras lib (which is multithreaded), but on windows (of course) if test "x$with_context" != "xwindows" ; then - GRAS_DEP="-lpthread" + GRAS_DEP="$GRAS_DEP -lpthread" fi fi AC_SEARCH_LIBS([connect],[socket],[],[],[]) # need -lsocket on solaris diff --git a/src/xbt/xbt_os_time.c b/src/xbt/xbt_os_time.c index ebd1f8bff7..3b0a26b2b7 100644 --- a/src/xbt/xbt_os_time.c +++ b/src/xbt/xbt_os_time.c @@ -85,35 +85,37 @@ void xbt_os_sleep(double sec) struct s_xbt_os_timer { -#ifdef HAVE_GETTIMEOFDAY +#ifdef HAVE_POSIX_GETTIME + struct timespec start, stop; +#elif defined(HAVE_GETTIMEOFDAY) struct timeval start, stop; #else unsigned long int start, stop; #endif }; -xbt_os_timer_t xbt_os_timer_new(void) -{ +xbt_os_timer_t xbt_os_timer_new(void) { return xbt_new0(struct s_xbt_os_timer, 1); } -void xbt_os_timer_free(xbt_os_timer_t timer) -{ +void xbt_os_timer_free(xbt_os_timer_t timer) { free(timer); } -void xbt_os_timer_start(xbt_os_timer_t timer) -{ -#ifdef HAVE_GETTIMEOFDAY +void xbt_os_timer_start(xbt_os_timer_t timer) { +#ifdef HAVE_POSIX_GETTIME + clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&(timer->start)); +#elif defined(HAVE_GETTIMEOFDAY) gettimeofday(&(timer->start), NULL); #else timer->start = (unsigned long int) (time(NULL)); #endif } -void xbt_os_timer_stop(xbt_os_timer_t timer) -{ -#ifdef HAVE_GETTIMEOFDAY +void xbt_os_timer_stop(xbt_os_timer_t timer) { +#ifdef HAVE_POSIX_GETTIME + clock_gettime(CLOCK_PROCESS_CPUTIME_ID,&(timer->stop)); +#elif defined(HAVE_GETTIMEOFDAY) gettimeofday(&(timer->stop), NULL); #else timer->stop = (unsigned long int) (time(NULL)); @@ -122,7 +124,11 @@ void xbt_os_timer_stop(xbt_os_timer_t timer) double xbt_os_timer_elapsed(xbt_os_timer_t timer) { -#ifdef HAVE_GETTIMEOFDAY +#ifdef HAVE_POSIX_GETTIME + return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) + + ((((double) timer->stop.tv_nsec) - + ((double) timer->start.tv_nsec)) / 1e-9); +#elif defined(HAVE_GETTIMEOFDAY) return ((double) timer->stop.tv_sec) - ((double) timer->start.tv_sec) + ((((double) timer->stop.tv_usec) - ((double) timer->start.tv_usec)) / 1000000.0);