/* Copyright (C) 1990, 1992 Free Software Foundation written by Doug Lea (dl@rocky.oswego.edu) This file is part of the GNU C++ Library. This library is free software; you can redistribute it and/or modify it under the terms of the GNU Library General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This library is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Library General Public License for more details. You should have received a copy of the GNU Library General Public License along with this library; if not, write to the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA. */ #ifdef __GNUG__ #pragma implementation #endif #include // Timing functions from Doug Schmidt... /* no such thing as "negative time"! */ #define TIMER_ERROR_VALUE -1.0 // If this does not work on your system, change this to #if 0, and // report the problem #if 1 #include <_G_config.h> #include #if !_G_HAVE_SYS_RESOURCE || !defined(RUSAGE_SELF) #define USE_TIMES #include #include #if !defined (HZ) && defined(CLK_TCK) #define HZ CLK_TCK #endif static struct tms Old_Time; static struct tms New_Time; #else static struct rusage Old_Time; static struct rusage New_Time; #endif static int Timer_Set = 0; double start_timer() { Timer_Set = 1; #ifdef USE_TIMES times(&Old_Time); return((double) Old_Time.tms_utime / HZ); #else getrusage(RUSAGE_SELF,&Old_Time); /* set starting process time */ return(Old_Time.ru_utime.tv_sec + (Old_Time.ru_utime.tv_usec / 1000000.0)); #endif } /* Returns process time since Last_Time. If parameter is 0.0, returns time since the Old_Time was set. Returns TIMER_ERROR_VALUE if `start_timer' is not called first. */ double return_elapsed_time(double Last_Time) { if (!Timer_Set) { return(TIMER_ERROR_VALUE); } else { /* get process time */ #ifdef USE_TIMES times(&New_Time); #else getrusage(RUSAGE_SELF,&New_Time); #endif if (Last_Time == 0.0) { #ifdef USE_TIMES return((double) (New_Time.tms_utime - Old_Time.tms_utime) / HZ); #else return((New_Time.ru_utime.tv_sec - Old_Time.ru_utime.tv_sec) + ((New_Time.ru_utime.tv_usec - Old_Time.ru_utime.tv_usec) / 1000000.0)); #endif } else { #ifdef USE_TIMES return((double) New_Time.tms_utime / HZ - Last_Time); #else return((New_Time.ru_utime.tv_sec + (New_Time.ru_utime.tv_usec / 1000000.0)) - Last_Time); #endif } } } #ifdef VMS void sys$gettim(unsigned int*) asm("sys$gettim"); getrusage(int dummy,struct rusage* time){ double rtime; unsigned int systime[2]; int i; sys$gettim(&systime[0]); rtime=systime[1]; for(i=0;i<4;i++) rtime *= 256; rtime+= systime[0]; /* we subtract an offset to make sure that the number fits in a long int*/ rtime=rtime/1.0e+7-4.144e+9; time->ru_utime.tv_sec= rtime; rtime=(rtime-time->ru_utime.tv_sec)*1.0e6; time->ru_utime.tv_usec= rtime; } #endif #else /* dummy them out */ double start_timer() { return TIMER_ERROR_VALUE; } double return_elapsed_time(double) { return TIMER_ERROR_VALUE; } #endif /* timing stuff */