]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - libiberty/getruntime.c
Update year range in copyright notice of binutils files
[thirdparty/binutils-gdb.git] / libiberty / getruntime.c
CommitLineData
252b5132 1/* Return time used so far, in microseconds.
d87bef3a 2 Copyright (C) 1994-2023 Free Software Foundation, Inc.
252b5132
RH
3
4This file is part of the libiberty library.
5Libiberty is free software; you can redistribute it and/or
6modify it under the terms of the GNU Library General Public
7License as published by the Free Software Foundation; either
8version 2 of the License, or (at your option) any later version.
9
10Libiberty is distributed in the hope that it will be useful,
11but WITHOUT ANY WARRANTY; without even the implied warranty of
12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13Library General Public License for more details.
14
15You should have received a copy of the GNU Library General Public
16License along with libiberty; see the file COPYING.LIB. If
979c05d3
NC
17not, write to the Free Software Foundation, Inc., 51 Franklin Street - Fifth Floor,
18Boston, MA 02110-1301, USA. */
252b5132
RH
19
20#include "config.h"
21
22#include "ansidecl.h"
23#include "libiberty.h"
24
cafa3917
DD
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
252b5132
RH
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
62df2065
JL
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
252b5132 45
33fbbfbc 46#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
252b5132
RH
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
6a8796db
UB
68#ifndef RUSAGE_SELF
69#define RUSAGE_SELF 0
70#endif
71
252b5132
RH
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
ba19b94f
DD
84/*
85
5d852400 86@deftypefn Replacement long get_run_time (void)
ba19b94f
DD
87
88Returns the time used so far, in microseconds. If possible, this is
89the time used by this process, else it is the elapsed time since the
90process started.
91
92@end deftypefn
93
94*/
95
252b5132 96long
49b1fae4 97get_run_time (void)
252b5132 98{
33fbbfbc 99#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
252b5132
RH
100 struct rusage rusage;
101
aaae08a7 102 getrusage (RUSAGE_SELF, &rusage);
252b5132
RH
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}