(root)/
binutils-2.41/
libiberty/
getruntime.c
       1  /* Return time used so far, in microseconds.
       2     Copyright (C) 1994-2023 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  }