Home | History | Annotate | Download | only in libiberty
      1 /* Return time used so far, in microseconds.
      2    Copyright (C) 1994, 1999, 2002 Free Software Foundation, Inc.
      3 
      4 This file is part of the libiberty library.
      5 Libiberty is free software; you can redistribute it and/or
      6 modify it under the terms of the GNU Library General Public
      7 License as published by the Free Software Foundation; either
      8 version 2 of the License, or (at your option) any later version.
      9 
     10 Libiberty 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 GNU
     13 Library General Public License for more details.
     14 
     15 You should have received a copy of the GNU Library General Public
     16 License along with libiberty; see the file COPYING.LIB.  If
     17 not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
     18 Boston, MA 02110-1301, USA.  */
     19 
     20 #include "config.h"
     21 
     22 #include "ansidecl.h"
     23 #include "libiberty.h"
     24 
     25 /* On some systems (such as WindISS), you must include <sys/types.h>
     26    to get the definition of "time_t" before you include <time.h>.  */
     27 #include <sys/types.h>
     28 
     29 /* There are several ways to get elapsed execution time; unfortunately no
     30    single way is available for all host systems, nor are there reliable
     31    ways to find out which way is correct for a given host. */
     32 
     33 #ifdef TIME_WITH_SYS_TIME
     34 # include <sys/time.h>
     35 # include <time.h>
     36 #else
     37 # if HAVE_SYS_TIME_H
     38 #  include <sys/time.h>
     39 # else
     40 #  ifdef HAVE_TIME_H
     41 #   include <time.h>
     42 #  endif
     43 # endif
     44 #endif
     45 
     46 #if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
     47 #include <sys/resource.h>
     48 #endif
     49 
     50 #ifdef HAVE_TIMES
     51 #ifdef HAVE_SYS_PARAM_H
     52 #include <sys/param.h>
     53 #endif
     54 #include <sys/times.h>
     55 #endif
     56 
     57 #ifdef HAVE_UNISTD_H
     58 #include <unistd.h>
     59 #endif
     60 
     61 /* This is a fallback; if wrong, it will likely make obviously wrong
     62    results. */
     63 
     64 #ifndef CLOCKS_PER_SEC
     65 #define CLOCKS_PER_SEC 1
     66 #endif
     67 
     68 #ifndef RUSAGE_SELF
     69 #define RUSAGE_SELF 0
     70 #endif
     71 
     72 #ifdef _SC_CLK_TCK
     73 #define GNU_HZ  sysconf(_SC_CLK_TCK)
     74 #else
     75 #ifdef HZ
     76 #define GNU_HZ  HZ
     77 #else
     78 #ifdef CLOCKS_PER_SEC
     79 #define GNU_HZ  CLOCKS_PER_SEC
     80 #endif
     81 #endif
     82 #endif
     83 
     84 /*
     85 
     86 @deftypefn Replacement long get_run_time (void)
     87 
     88 Returns the time used so far, in microseconds.  If possible, this is
     89 the time used by this process, else it is the elapsed time since the
     90 process started.
     91 
     92 @end deftypefn
     93 
     94 */
     95 
     96 long
     97 get_run_time (void)
     98 {
     99 #if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
    100   struct rusage rusage;
    101 
    102   getrusage (RUSAGE_SELF, &rusage);
    103   return (rusage.ru_utime.tv_sec * 1000000 + rusage.ru_utime.tv_usec
    104 	  + rusage.ru_stime.tv_sec * 1000000 + rusage.ru_stime.tv_usec);
    105 #else /* ! HAVE_GETRUSAGE */
    106 #ifdef HAVE_TIMES
    107   struct tms tms;
    108 
    109   times (&tms);
    110   return (tms.tms_utime + tms.tms_stime) * (1000000 / GNU_HZ);
    111 #else /* ! HAVE_TIMES */
    112   /* Fall back on clock and hope it's correctly implemented. */
    113   const long clocks_per_sec = CLOCKS_PER_SEC;
    114   if (clocks_per_sec <= 1000000)
    115     return clock () * (1000000 / clocks_per_sec);
    116   else
    117     return clock () / clocks_per_sec;
    118 #endif  /* HAVE_TIMES */
    119 #endif  /* HAVE_GETRUSAGE */
    120 }
    121