#include "config.h"
#include <sys/types.h>
#include "libgfortran.h"
#ifdef HAVE_UNISTD_H
#include <unistd.h>
#endif
#ifdef 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>
# endif
# endif
#endif
#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
# include <sys/resource.h>
#else
# if defined (HAVE_TIMES) && (defined (HZ) || defined (_SC_CLK_TCK) || defined (CLK_TCK))
# ifdef HAVE_SYS_PARAM_H
# include <sys/param.h>
# endif
# include <sys/times.h>
# ifndef HZ
# if defined _SC_CLK_TCK
# define HZ sysconf(_SC_CLK_TCK)
# else
# define HZ CLK_TCK
# endif
# endif
# endif
#endif
#if defined (__GNUC__) && (__GNUC__ >= 3)
# define ATTRIBUTE_ALWAYS_INLINE __attribute__ ((__always_inline__))
#else
# define ATTRIBUTE_ALWAYS_INLINE
#endif
static inline void __cpu_time_1 (long *, long *) ATTRIBUTE_ALWAYS_INLINE;
static inline void
__cpu_time_1 (long *sec, long *usec)
{
#if defined (HAVE_GETRUSAGE) && defined (HAVE_SYS_RESOURCE_H)
struct rusage usage;
getrusage (0, &usage);
*sec = usage.ru_utime.tv_sec + usage.ru_stime.tv_sec;
*usec = usage.ru_utime.tv_usec + usage.ru_stime.tv_usec;
#else
#ifdef HAVE_TIMES
struct tms buf;
times (&buf);
*sec = 0;
*usec = (buf.tms_utime + buf.tms_stime) * (1000000 / HZ);
#else
*sec = -1;
*usec = 0;
#endif
#endif
}
#undef CPU_TIME
#define CPU_TIME(KIND) \
void prefix(cpu_time_##KIND) (GFC_REAL_##KIND *__time) \
{ \
long sec, usec; \
__cpu_time_1 (&sec, &usec); \
*__time = (GFC_REAL_##KIND) sec + \
((GFC_REAL_##KIND) usec) * 1.e-6; \
}
CPU_TIME(4)
CPU_TIME(8)
void
prefix(second_sub) (GFC_REAL_4 *s)
{
prefix(cpu_time_4)(s);
}
GFC_REAL_4
prefix(second) (void)
{
GFC_REAL_4 s;
prefix(cpu_time_4)(&s);
return s;
}