ISCE_INSAR/components/isceobj/Util/src/second.c

126 lines
2.7 KiB
C

#include <unistd.h>
#include <sys/time.h>
#include <sys/times.h>
#include <sys/resource.h>
#if defined(NEEDS_F77_TRANSLATION)
#if defined(F77EXTERNS_LOWERCASE_TRAILINGBAR)
#define secondo secondo_
#define wc_second wc_second_
#define us_second us_second_
#elif defined(F77EXTERNS_NOTRAILINGBAR)
#define secondo secondo
#define wc_second wc_second
#define us_second us_second
#elif defined(F77EXTERNS_EXTRATRAILINGBAR)
#define secondo secondo__
#define wc_second wc_second__
#define us_second us_second__
#elif defined(F77EXTERNS_UPPERCASE_NOTRAILINGBAR)
#define secondo SECONDO
#define wc_second WC_SECOND
#define us_second US_SECOND
#elif defined(F77EXTERNS_COMPAQ_F90)
#define secondo secondo_
#define wc_second wc_second_
#define us_second us_second_
#else
#error Unknown translation for FORTRAN external symbols
#endif
#endif
/* The same code is used for both C and Fortran entry points.
*/
#define WC_GUTS \
\
static int first = 1; \
static double t0; \
struct timeval s_val; \
\
gettimeofday(&s_val,0); \
if (first) { \
t0 = (double) s_val.tv_sec + 0.000001*s_val.tv_usec; \
first = 0; \
return (0.0); \
} \
return ((double) s_val.tv_sec + 0.000001*s_val.tv_usec - t0);
/* Returns the current value of the wall clock timer.
* Fortran or C entry point.
*/
double
wc_second()
{
WC_GUTS;
}
#define US_GUTS \
\
static int first = 1; \
static double t0; \
struct rusage ru; \
double tu, ts; \
\
getrusage(RUSAGE_SELF,&ru); \
if (first) { \
t0 = ru.ru_utime.tv_sec + 1.0e-6*ru.ru_utime.tv_usec \
+ ru.ru_stime.tv_sec + 1.0e-6*ru.ru_stime.tv_usec; \
first = 0; \
return (0.0); \
} \
\
tu = ru.ru_utime.tv_sec + 1.0e-6*ru.ru_utime.tv_usec; \
ts = ru.ru_stime.tv_sec + 1.0e-6*ru.ru_stime.tv_usec; \
\
return (tu + ts - t0);
/* Returns the current value of the user+system timer. Fortran or C entry point.
*/
double
us_second()
{
US_GUTS;
}
/* Returns the current value of the wall clock timer, or
* user+system timer depending on the valueof tmode:
* less than zero the wall-clock timer, and greater than zero
* user+system time.
* If/when called from C, tmode must be passed by reference.
*/
double
secondo(
int *ptmode)
{
int tmode = *ptmode;
if (tmode > 0) {
US_GUTS;
} else if (tmode < 0) {
WC_GUTS;
} else if (tmode == 0) {
printf("Invalid tmode.\n");
return(0.0);
}
/* XXBUG - bswift 11/4/04 'if (tmode == 0)' should be removed to prevent compiler warning about no return for non-void function */
}