Skip to content
Projects
Groups
Snippets
Help
This project
Loading...
Sign in / Register
Toggle navigation
R
riscv-gcc-1
Overview
Overview
Details
Activity
Cycle Analytics
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Charts
Issues
0
Issues
0
List
Board
Labels
Milestones
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Charts
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Charts
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
lvzhengyang
riscv-gcc-1
Commits
b6e7a3d1
Commit
b6e7a3d1
authored
Jan 31, 2011
by
Janne Blomqvist
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Use clock_gettime in libgfortran timing intrinsics, cleanup
From-SVN: r169449
parent
e1bcd685
Hide whitespace changes
Inline
Side-by-side
Showing
10 changed files
with
257 additions
and
174 deletions
+257
-174
libgfortran/ChangeLog
+16
-0
libgfortran/config.h.in
+3
-0
libgfortran/configure
+63
-0
libgfortran/configure.ac
+11
-0
libgfortran/intrinsics/cpu_time.c
+12
-38
libgfortran/intrinsics/date_and_time.c
+6
-36
libgfortran/intrinsics/dtime.c
+4
-3
libgfortran/intrinsics/etime.c
+4
-3
libgfortran/intrinsics/system_clock.c
+26
-85
libgfortran/intrinsics/time_1.h
+112
-9
No files found.
libgfortran/ChangeLog
View file @
b6e7a3d1
2011-01-31 Janne Blomqvist <jb@gcc.gnu.org>
* configure.ac: Check for clock_gettime().
* configure: Regenerated.
* config.h.in: Regenerated.
* intrinsics/time_1.h (__time_1): Rename to gf_cputime, add
times() fallback.
(gf_gettime): New function.
* intrinsics/cpu_time.c (__cpu_time_1): Update to call gf_cputime.
* intrinsics/date_and_time.c (date_and_time): Use gf_gettime.
* intrinsics/dtime.c (dtime_sub): Use gf_cputime.
* intrinsics/etime.c (etime_sub): Use gf_cputime.
* intrinsics/system_clock.c (system_clock_4): Use gf_gettime.
(system_clock_8): Use gf_gettime, increase count rate to allow
nanosecond precision, remove overflow prone branch.
2011-01-29 Jerry DeLisle <jvdelisle@gcc.gnu.org>
PR libgfortran/47434
...
...
libgfortran/config.h.in
View file @
b6e7a3d1
...
...
@@ -207,6 +207,9 @@
/* Define to 1 if you have the `clock' function. */
#undef HAVE_CLOCK
/* Define to 1 if you have the `clock_gettime' function. */
#undef HAVE_CLOCK_GETTIME
/* libm includes clog */
#undef HAVE_CLOG
...
...
libgfortran/configure
View file @
b6e7a3d1
...
...
@@ -16380,6 +16380,17 @@ _ACEOF
fi
done
for
ac_func
in
clock_gettime
do
:
ac_fn_c_check_func
"
$LINENO
"
"clock_gettime"
"ac_cv_func_clock_gettime"
if
test
"x
$ac_cv_func_clock_gettime
"
=
x
""
yes
;
then
:
cat
>>
confdefs.h
<<
_ACEOF
#define HAVE_CLOCK_GETTIME 1
_ACEOF
fi
done
# Check for glibc backtrace functions
for
ac_func
in
backtrace backtrace_symbols
...
...
@@ -25249,6 +25260,58 @@ $as_echo "#define HAVE_FEENABLEEXCEPT 1" >>confdefs.h
fi
# At least for glibc, clock_gettime is in librt. But don't pull that
# in if it still doesn't give us the function we want.
# This test is copied from libgomp.
if
test
$ac_cv_func_clock_gettime
=
no
;
then
{
$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
"
if
test
x
$gcc_no_link
=
xyes
;
then
as_fn_error
"Link tests are not allowed after GCC_NO_EXECUTABLES."
"
$LINENO
"
5
fi
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
:
LIBS
=
"-lrt
$LIBS
"
$as_echo
"#define HAVE_CLOCK_GETTIME 1"
>>
confdefs.h
fi
fi
# Check for SysV fpsetmask
{
$as_echo
"
$as_me
:
${
as_lineno
-
$LINENO
}
: checking whether fpsetmask is present"
>
&5
...
...
libgfortran/configure.ac
View file @
b6e7a3d1
...
...
@@ -252,6 +252,7 @@ AC_CHECK_FUNCS(sleep time ttyname signal alarm ctime clock access fork execl)
AC_CHECK_FUNCS(wait setmode execvp pipe dup2 close fdopen strcasestr getrlimit)
AC_CHECK_FUNCS(gettimeofday stat fstat lstat getpwuid vsnprintf dup getcwd)
AC_CHECK_FUNCS(localtime_r gmtime_r strerror_r getpwuid_r ttyname_r ctime_r)
AC_CHECK_FUNCS(clock_gettime)
# Check for glibc backtrace functions
AC_CHECK_FUNCS(backtrace backtrace_symbols)
...
...
@@ -483,6 +484,16 @@ LIBGFOR_CHECK_FLOAT128
# Check for GNU libc feenableexcept
AC_CHECK_LIB([m],[feenableexcept],[have_feenableexcept=yes AC_DEFINE([HAVE_FEENABLEEXCEPT],[1],[libm includes feenableexcept])])
# At least for glibc, clock_gettime is in librt. But don't pull that
# in if it still doesn't give us the function we want.
# This test is copied from libgomp.
if test $ac_cv_func_clock_gettime = no; then
AC_CHECK_LIB(rt, clock_gettime,
[LIBS="-lrt $LIBS"
AC_DEFINE(HAVE_CLOCK_GETTIME, 1,
[Define to 1 if you have the `clock_gettime' function.])])
fi
# Check for SysV fpsetmask
LIBGFOR_CHECK_FPSETMASK
...
...
libgfortran/intrinsics/cpu_time.c
View file @
b6e7a3d1
/* Implementation of the CPU_TIME intrinsic.
Copyright (C) 2003, 2007, 2009, 2010 Free Software Foundation, Inc.
Copyright (C) 2003, 2007, 2009, 2010
, 2011
Free Software Foundation, Inc.
This file is part of the GNU Fortran
95
runtime library (libgfortran).
This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
...
...
@@ -25,49 +25,23 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include "libgfortran.h"
#include "time_1.h"
/* The most accurate way to get the CPU time is getrusage ().
If we have times(), that's good enough, too. */
#if !defined (HAVE_GETRUSAGE) || !defined (HAVE_SYS_RESOURCE_H)
/* For times(), we _must_ know the number of clock ticks per second. */
# if defined (HAVE_TIMES) && (defined (HZ) || defined (_SC_CLK_TCK) || defined (CLK_TCK))
# ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
# endif
# if defined (HAVE_SYS_TIMES_H)
# include <sys/times.h>
# endif
# ifndef HZ
# if defined _SC_CLK_TCK
# define HZ sysconf(_SC_CLK_TCK)
# else
# define HZ CLK_TCK
# endif
# endif
# endif
/* HAVE_TIMES etc. */
#endif
/* !HAVE_GETRUSAGE || !HAVE_SYS_RESOURCE_H */
static
inline
void
__cpu_time_1
(
long
*
,
long
*
)
ATTRIBUTE_ALWAYS_INLINE
;
static
inline
void
__cpu_time_1
(
long
*
sec
,
long
*
usec
)
{
#if defined(__MINGW32__) || defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
long
user_sec
,
user_usec
,
system_sec
,
system_usec
;
__time_1
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
);
*
sec
=
user_sec
+
system_sec
;
*
usec
=
user_usec
+
system_usec
;
#else
/* ! HAVE_GETRUSAGE || ! HAVE_SYS_RESOURCE_H */
#ifdef HAVE_TIMES
struct
tms
buf
;
times
(
&
buf
);
*
sec
=
0
;
*
usec
=
(
buf
.
tms_utime
+
buf
.
tms_stime
)
*
(
1000000
/
HZ
);
#else
/* ! HAVE_TIMES */
/* We have nothing to go on. Return -1. */
*
sec
=
-
1
;
*
usec
=
0
;
#endif
/* HAVE_TIMES */
#endif
/* __MINGW32__ || HAVE_GETRUSAGE */
if
(
gf_cputime
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
)
==
0
)
{
*
sec
=
user_sec
+
system_sec
;
*
usec
=
user_usec
+
system_usec
;
}
else
{
*
sec
=
-
1
;
*
usec
=
0
;
}
}
...
...
libgfortran/intrinsics/date_and_time.c
View file @
b6e7a3d1
/* Implementation of the DATE_AND_TIME intrinsic.
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010
Copyright (C) 2003, 2004, 2005, 2006, 2007, 2009, 2010
, 2011
Free Software Foundation, Inc.
Contributed by Steven Bosscher.
...
...
@@ -29,21 +29,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include <assert.h>
#include <stdlib.h>
#undef HAVE_NO_DATE_TIME
#if TIME_WITH_SYS_TIME
# include <sys/time.h>
# include <time.h>
#else
# if HAVE_SYS_TIME_H
# include <sys/time.h>
# else
# ifdef HAVE_TIME_H
# include <time.h>
# else
# define HAVE_NO_DATE_TIME
# endif
/* HAVE_TIME_H */
# endif
/* HAVE_SYS_TIME_H */
#endif
/* TIME_WITH_SYS_TIME */
#include "time_1.h"
#ifndef abs
#define abs(x) ((x)>=0 ? (x) : -(x))
...
...
@@ -176,28 +162,12 @@ date_and_time (char *__date, char *__time, char *__zone,
struct
tm
local_time
;
struct
tm
UTC_time
;
#if HAVE_GETTIMEOFDAY
{
struct
timeval
tp
;
if
(
!
gettimeofday
(
&
tp
,
NULL
))
{
lt
=
tp
.
tv_sec
;
values
[
7
]
=
tp
.
tv_usec
/
1000
;
}
else
{
lt
=
time
(
NULL
);
values
[
7
]
=
0
;
}
}
#else
lt
=
time
(
NULL
);
values
[
7
]
=
0
;
#endif
/* HAVE_GETTIMEOFDAY */
long
nanosecs
;
if
(
lt
!=
(
time_t
)
-
1
)
if
(
!
gf_gettime
(
GF_CLOCK_REALTIME
,
&
lt
,
&
nanosecs
)
)
{
values
[
7
]
=
nanosecs
/
1000000
;
localtime_r
(
&
lt
,
&
local_time
);
gmtime_r
(
&
lt
,
&
UTC_time
);
...
...
libgfortran/intrinsics/dtime.c
View file @
b6e7a3d1
/* Implementation of the dtime intrinsic.
Copyright (C) 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006, 2007, 2009, 2011 Free Software
Foundation, Inc.
This file is part of the GNU Fortran
95
runtime library (libgfortran).
This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
...
...
@@ -47,7 +48,7 @@ dtime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
runtime_error
(
"Insufficient number of elements in TARRAY."
);
__gthread_mutex_lock
(
&
dtime_update_lock
);
if
(
__time_1
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
)
==
0
)
if
(
gf_cputime
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
)
==
0
)
{
tu
=
(
GFC_REAL_4
)
((
user_sec
-
us
)
+
1.e-6
*
(
user_usec
-
uu
));
ts
=
(
GFC_REAL_4
)
((
system_sec
-
ss
)
+
1.e-6
*
(
system_usec
-
su
));
...
...
libgfortran/intrinsics/etime.c
View file @
b6e7a3d1
/* Implementation of the ETIME intrinsic.
Copyright (C) 2004, 2005, 2006, 2007, 2009 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2006, 2007, 2009, 2011 Free Software
Foundation, Inc.
Contributed by Steven G. Kargl <kargls@comcast.net>.
This file is part of the GNU Fortran
95
runtime library (libgfortran).
This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
...
...
@@ -38,7 +39,7 @@ etime_sub (gfc_array_r4 *t, GFC_REAL_4 *result)
if
(((
GFC_DESCRIPTOR_EXTENT
(
t
,
0
)))
<
2
)
runtime_error
(
"Insufficient number of elements in TARRAY."
);
if
(
__time_1
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
)
==
0
)
if
(
gf_cputime
(
&
user_sec
,
&
user_usec
,
&
system_sec
,
&
system_usec
)
==
0
)
{
tu
=
(
GFC_REAL_4
)(
user_sec
+
1.e-6
*
user_usec
);
ts
=
(
GFC_REAL_4
)(
system_sec
+
1.e-6
*
system_usec
);
...
...
libgfortran/intrinsics/system_clock.c
View file @
b6e7a3d1
/* Implementation of the SYSTEM_CLOCK intrinsic.
Copyright (C) 2004, 2005, 2007, 2009, 2010 Free Software Foundation, Inc.
Copyright (C) 2004, 2005, 2007, 2009, 2010, 2011 Free Software
Foundation, Inc.
This file is part of the GNU Fortran runtime library (libgfortran).
...
...
@@ -26,15 +27,7 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
#include <limits.h>
#if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY)
# include <sys/time.h>
#elif defined(HAVE_TIME_H)
# include <time.h>
# define TCK 1
#else
#define TCK 0
#endif
#include "time_1.h"
extern
void
system_clock_4
(
GFC_INTEGER_4
*
,
GFC_INTEGER_4
*
,
GFC_INTEGER_4
*
);
export_proto
(
system_clock_4
);
...
...
@@ -52,21 +45,21 @@ void
system_clock_4
(
GFC_INTEGER_4
*
count
,
GFC_INTEGER_4
*
count_rate
,
GFC_INTEGER_4
*
count_max
)
{
#undef TCK
#define TCK 1000
GFC_INTEGER_4
cnt
;
GFC_INTEGER_4
mx
;
#if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY)
#undef TCK
#define TCK 1000
struct
timeval
tp1
;
time_t
secs
;
long
nanosecs
;
if
(
sizeof
(
tp1
.
tv_sec
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"
tv_sec
too small"
);
if
(
sizeof
(
secs
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"
secs
too small"
);
if
(
g
ettimeofday
(
&
tp1
,
NULL
)
==
0
)
if
(
g
f_gettime
(
GF_CLOCK_MONOTONIC
,
&
secs
,
&
nanosecs
)
==
0
)
{
GFC_UINTEGER_4
ucnt
=
(
GFC_UINTEGER_4
)
tp1
.
tv_sec
*
TCK
;
ucnt
+=
(
tp1
.
tv_usec
+
500000
/
TCK
)
/
(
1
000000
/
TCK
);
GFC_UINTEGER_4
ucnt
=
(
GFC_UINTEGER_4
)
secs
*
TCK
;
ucnt
+=
(
nanosecs
+
500000000
/
TCK
)
/
(
1000
000000
/
TCK
);
if
(
ucnt
>
GFC_INTEGER_4_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_4_HUGE
-
1
;
else
...
...
@@ -83,22 +76,7 @@ system_clock_4(GFC_INTEGER_4 *count, GFC_INTEGER_4 *count_rate,
*
count_max
=
0
;
return
;
}
#elif defined(HAVE_TIME_H)
GFC_UINTEGER_4
ucnt
;
if
(
sizeof
(
time_t
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"time_t too small"
);
ucnt
=
time
(
NULL
);
if
(
ucnt
>
GFC_INTEGER_4_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_4_HUGE
-
1
;
else
cnt
=
ucnt
;
mx
=
GFC_INTEGER_4_HUGE
;
#else
cnt
=
-
GFC_INTEGER_4_HUGE
;
mx
=
0
;
#endif
if
(
count
!=
NULL
)
*
count
=
cnt
;
if
(
count_rate
!=
NULL
)
...
...
@@ -114,39 +92,26 @@ void
system_clock_8
(
GFC_INTEGER_8
*
count
,
GFC_INTEGER_8
*
count_rate
,
GFC_INTEGER_8
*
count_max
)
{
#undef TCK
#define TCK 1000000000
GFC_INTEGER_8
cnt
;
GFC_INTEGER_8
mx
;
#if defined(HAVE_SYS_TIME_H) && defined(HAVE_GETTIMEOFDAY)
#undef TCK
#define TCK 1000000
struct
timeval
tp1
;
time_t
secs
;
long
nanosecs
;
if
(
sizeof
(
tp1
.
tv_sec
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"
tv_sec
too small"
);
if
(
sizeof
(
secs
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"
secs
too small"
);
if
(
g
ettimeofday
(
&
tp1
,
NULL
)
==
0
)
if
(
g
f_gettime
(
GF_CLOCK_MONOTONIC
,
&
secs
,
&
nanosecs
)
==
0
)
{
if
(
sizeof
(
tp1
.
tv_sec
)
<
sizeof
(
GFC_INTEGER_8
))
{
GFC_UINTEGER_4
ucnt
=
(
GFC_UINTEGER_4
)
tp1
.
tv_sec
*
TCK
;
ucnt
+=
(
tp1
.
tv_usec
+
500000
/
TCK
)
/
(
1000000
/
TCK
);
if
(
ucnt
>
GFC_INTEGER_4_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_4_HUGE
-
1
;
else
cnt
=
ucnt
;
mx
=
GFC_INTEGER_4_HUGE
;
}
GFC_UINTEGER_8
ucnt
=
(
GFC_UINTEGER_8
)
secs
*
TCK
;
ucnt
+=
(
nanosecs
+
500000000
/
TCK
)
/
(
1000000000
/
TCK
);
if
(
ucnt
>
GFC_INTEGER_8_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_8_HUGE
-
1
;
else
{
GFC_UINTEGER_8
ucnt
=
(
GFC_UINTEGER_8
)
tp1
.
tv_sec
*
TCK
;
ucnt
+=
(
tp1
.
tv_usec
+
500000
/
TCK
)
/
(
1000000
/
TCK
);
if
(
ucnt
>
GFC_INTEGER_8_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_8_HUGE
-
1
;
else
cnt
=
ucnt
;
mx
=
GFC_INTEGER_8_HUGE
;
}
cnt
=
ucnt
;
mx
=
GFC_INTEGER_8_HUGE
;
}
else
{
...
...
@@ -159,31 +124,7 @@ system_clock_8 (GFC_INTEGER_8 *count, GFC_INTEGER_8 *count_rate,
return
;
}
#elif defined(HAVE_TIME_H)
if
(
sizeof
(
time_t
)
<
sizeof
(
GFC_INTEGER_4
))
internal_error
(
NULL
,
"time_t too small"
);
else
if
(
sizeof
(
time_t
)
==
sizeof
(
GFC_INTEGER_4
))
{
GFC_UINTEGER_4
ucnt
=
time
(
NULL
);
if
(
ucnt
>
GFC_INTEGER_4_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_4_HUGE
-
1
;
else
cnt
=
ucnt
;
mx
=
GFC_INTEGER_4_HUGE
;
}
else
{
GFC_UINTEGER_8
ucnt
=
time
(
NULL
);
if
(
ucnt
>
GFC_INTEGER_8_HUGE
)
cnt
=
ucnt
-
GFC_INTEGER_8_HUGE
-
1
;
else
cnt
=
ucnt
;
mx
=
GFC_INTEGER_8_HUGE
;
}
#else
cnt
=
-
GFC_INTEGER_8_HUGE
;
mx
=
0
;
#endif
if
(
count
!=
NULL
)
*
count
=
cnt
;
if
(
count_rate
!=
NULL
)
...
...
libgfortran/intrinsics/time_1.h
View file @
b6e7a3d1
/*
Implementation of the CPU_TIME intrinsic
.
Copyright (C) 2003, 2007, 2009 Free Software Foundation, Inc.
/*
Wrappers for platform timing functions
.
Copyright (C) 2003, 2007, 2009
, 2011
Free Software Foundation, Inc.
This file is part of the GNU Fortran
95
runtime library (libgfortran).
This file is part of the GNU Fortran runtime library (libgfortran).
Libgfortran is free software; you can redistribute it and/or
modify it under the terms of the GNU General Public
...
...
@@ -60,16 +60,38 @@ see the files COPYING3 and COPYING.RUNTIME respectively. If not, see
# include <sys/resource.h>
#endif
/* HAVE_GETRUSAGE && HAVE_SYS_RESOURCE_H */
/* The most accurate way to get the CPU time is getrusage ().
If we have times(), that's good enough, too. */
#if !defined (HAVE_GETRUSAGE) || !defined (HAVE_SYS_RESOURCE_H)
/* For times(), we _must_ know the number of clock ticks per second. */
# if defined (HAVE_TIMES) && (defined (HZ) || defined (_SC_CLK_TCK) || defined (CLK_TCK))
# ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
# endif
# if defined (HAVE_SYS_TIMES_H)
# include <sys/times.h>
# endif
# ifndef HZ
# if defined _SC_CLK_TCK
# define HZ sysconf(_SC_CLK_TCK)
# else
# define HZ CLK_TCK
# endif
# endif
# endif
/* HAVE_TIMES etc. */
#endif
/* !HAVE_GETRUSAGE || !HAVE_SYS_RESOURCE_H */
#if defined (__GNUC__) && (__GNUC__ >= 3)
# define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
#else
# define ATTRIBUTE_ALWAYS_INLINE
#endif
static
inline
int
__time_1
(
long
*
,
long
*
,
long
*
,
long
*
)
ATTRIBUTE_ALWAYS_INLINE
;
static
inline
int
gf_cputime
(
long
*
,
long
*
,
long
*
,
long
*
)
ATTRIBUTE_ALWAYS_INLINE
;
/* Helper function for the actual implementation of the DTIME, ETIME and
CPU_TIME intrinsics. Returns
a CPU time in microsecond
s or -1 if no
CPU_TIME intrinsics. Returns
0 for succes
s or -1 if no
CPU time could be computed. */
#ifdef __MINGW32__
...
...
@@ -78,7 +100,7 @@ static inline int __time_1 (long *, long *, long *, long *) ATTRIBUTE_ALWAYS_INL
#include <windows.h>
static
int
__time_1
(
long
*
user_sec
,
long
*
user_usec
,
long
*
system_sec
,
long
*
system_usec
)
gf_cputime
(
long
*
user_sec
,
long
*
user_usec
,
long
*
system_sec
,
long
*
system_usec
)
{
union
{
FILETIME
ft
;
...
...
@@ -112,23 +134,37 @@ __time_1 (long *user_sec, long *user_usec, long *system_sec, long *system_usec)
#else
static
inline
int
__time_1
(
long
*
user_sec
,
long
*
user_usec
,
long
*
system_sec
,
long
*
system_usec
)
gf_cputime
(
long
*
user_sec
,
long
*
user_usec
,
long
*
system_sec
,
long
*
system_usec
)
{
#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
struct
rusage
usage
;
getrusage
(
RUSAGE_SELF
,
&
usage
);
int
err
;
err
=
getrusage
(
RUSAGE_SELF
,
&
usage
);
*
user_sec
=
usage
.
ru_utime
.
tv_sec
;
*
user_usec
=
usage
.
ru_utime
.
tv_usec
;
*
system_sec
=
usage
.
ru_stime
.
tv_sec
;
*
system_usec
=
usage
.
ru_stime
.
tv_usec
;
return
err
;
#elif defined HAVE_TIMES
struct
tms
buf
;
clock_t
err
;
err
=
times
(
&
buf
);
*
user_sec
=
buf
.
tms_utime
/
HZ
;
*
user_usec
=
buf
.
tms_utime
%
HZ
*
(
1000000
/
HZ
);
*
system_sec
=
buf
.
tms_stime
/
HZ
;
*
system_usec
=
buf
.
tms_stime
%
HZ
*
(
1000000
/
HZ
);
if
((
err
==
(
clock_t
)
-
1
)
&&
errno
!=
0
)
return
-
1
;
return
0
;
#else
/* ! HAVE_GETRUSAGE || ! HAVE_SYS_RESOURCE_H */
#else
/* We have nothing to go on. Return -1. */
*
user_sec
=
*
system_sec
=
0
;
*
user_usec
=
*
system_usec
=
0
;
errno
=
ENOSYS
;
return
-
1
;
#endif
...
...
@@ -137,4 +173,71 @@ __time_1 (long *user_sec, long *user_usec, long *system_sec, long *system_usec)
#endif
/* POSIX states that CLOCK_REALTIME must be present if clock_gettime
is available, others are optional. */
#ifdef CLOCK_REALTIME
#define GF_CLOCK_REALTIME CLOCK_REALTIME
#else
#define GF_CLOCK_REALTIME 0
#endif
#ifdef CLOCK_MONOTONIC
#define GF_CLOCK_MONOTONIC CLOCK_MONOTONIC
#else
#define GF_CLOCK_REALTIME GF_CLOCK_REALTIME
#endif
/* Arguments:
clock_id - INPUT, must be either GF_CLOCK_REALTIME or GF_CLOCK_MONOTONIC
secs - OUTPUT, seconds
nanosecs - OUTPUT, OPTIONAL, nanoseconds
If clock_id equals GF_CLOCK_REALTIME, the OUTPUT arguments shall be
the number of seconds and nanoseconds since the Epoch. If clock_id
equals GF_CLOCK_MONOTONIC, and if the target supports it, the
OUTPUT arguments represent a monotonically incrementing clock
starting from some unspecified time in the past.
Return value: 0 for success, -1 for error. In case of error, errno
is set.
*/
static
inline
int
gf_gettime
(
int
clock_id
__attribute__
((
unused
)),
time_t
*
secs
,
long
*
nanosecs
)
{
#ifdef HAVE_CLOCK_GETTIME
struct
timespec
ts
;
int
err
;
err
=
clock_gettime
(
clock_id
,
&
ts
);
*
secs
=
ts
.
tv_sec
;
if
(
nanosecs
)
*
nanosecs
=
ts
.
tv_nsec
;
return
err
;
#elif HAVE_GETTIMEOFDAY
struct
timeval
tv
;
int
err
;
err
=
gettimeofday
(
&
tv
,
NULL
);
*
secs
=
tv
.
tv_sec
;
if
(
nanosecs
)
*
nanosecs
=
tv
.
tv_usec
*
1000
;
return
err
;
#elif HAVE_TIME
time_t
t
,
t2
;
t
=
time
(
&
t2
);
*
secs
=
t2
;
if
(
nanosecs
)
*
nanosecs
=
0
;
if
(
t
==
((
time_t
)
-
1
))
return
-
1
;
return
0
;
#else
*
secs
=
0
;
if
(
nanosecs
)
*
nanosecs
=
0
;
errno
=
ENOSYS
;
return
-
1
;
#endif
}
#endif
/* LIBGFORTRAN_TIME_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment