File:  [ELWIX - Embedded LightWeight unIX -] / embedaddon / lrzsz / src / timing.c
Revision 1.1.1.1 (vendor branch): download - view: text, annotated - select for diffs - revision graph
Thu Oct 24 15:49:50 2019 UTC (4 years, 11 months ago) by misho
Branches: lrzsz, MAIN
CVS tags: v0_12_20p5, HEAD
lrzsz ver 0.12.20

    1: /*
    2:   timing.c - Timing routines for computing elapsed wall time
    3:   Copyright (C) 1994 Michael D. Black
    4:   Copyright (C) 1996, 1997 Uwe Ohse
    5: 
    6:   This program is free software; you can redistribute it and/or modify
    7:   it under the terms of the GNU General Public License as published by
    8:   the Free Software Foundation; either version 2, or (at your option)
    9:   any later version.
   10: 
   11:   This program is distributed in the hope that it will be useful,
   12:   but WITHOUT ANY WARRANTY; without even the implied warranty of
   13:   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   14:   GNU General Public License for more details.
   15: 
   16:   You should have received a copy of the GNU General Public License
   17:   along with this program; if not, write to the Free Software
   18:   Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
   19:   02111-1307, USA.
   20: 
   21:   originally written by Michael D. Black, mblack@csihq.com
   22: */
   23: 
   24: #include "zglobal.h"
   25: 
   26: #include "timing.h"
   27: 
   28: #if HAVE_SYS_PARAM_H
   29: #include <sys/param.h>
   30: #endif
   31: 
   32: #if !defined(TIME_WITH_SYS_TIME) && !defined(HAVE_SYS_TIME_H)
   33:    /* can't use gettimeofday without struct timeval */
   34: #  undef HAVE_GETTIMEOFDAY
   35: #endif
   36: 
   37: /* Prefer gettimeofday to ftime to times.  */
   38: #if defined(HAVE_GETTIMEOFDAY)
   39: #  undef HAVE_FTIME
   40: #  undef HAVE_TIMES
   41: #else
   42: #  if defined(HAVE_FTIME)
   43: #    undef HAVE_TIMES
   44: #  endif
   45: #endif
   46: 
   47: #ifdef HAVE_FTIME
   48: #  include <sys/timeb.h>
   49: #endif
   50: 
   51: #ifdef HAVE_TIMES
   52: #  if HAVE_SYS_TIMES_H
   53: #    include <sys/times.h>
   54: #  endif
   55: #  ifdef _SC_CLK_TCK
   56: #    define HAVE_SC_CLK_TCK 1
   57: #  else
   58: #    define HAVE_SC_CLK_TCK 0
   59: #  endif
   60: /* TIMES_TICK may have been set in policy.h, or we may be able to get
   61:    it using sysconf.  If neither is the case, try to find a useful
   62:    definition from the system header files.  */
   63: #  if !defined(TIMES_TICK) && (!defined(HAVE_SYSCONF) || !defined(HAVE_SC_CLK_TCK))
   64: #    ifdef CLK_TCK
   65: #      define TIMES_TICK CLK_TCK
   66: #    else /* ! defined (CLK_TCK) */
   67: #      ifdef HZ
   68: #        define TIMES_TICK HZ
   69: #      endif /* defined (HZ) */
   70: #    endif /* ! defined (CLK_TCK) */
   71: #else
   72: #  endif /* TIMES_TICK == 0 && (! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK) */
   73: #  ifndef TIMES_TICK
   74: #    define TIMES_TICK 0
   75: #  endif
   76: #endif /* HAVE_TIMES */
   77: 
   78: #ifdef HAVE_GETTIMEOFDAY
   79: /* collides with Solaris 2.5 prototype? */
   80: /* int gettimeofday (struct timeval *tv, struct timezone *tz); */
   81: #endif
   82: 
   83: double 
   84: timing (int reset, time_t *nowp)
   85: {
   86:   static double elaptime, starttime, stoptime;
   87:   double yet;
   88: #define NEED_TIME
   89: #ifdef HAVE_GETTIMEOFDAY
   90:   struct timeval tv;
   91:   struct timezone tz;
   92: 
   93: #ifdef DST_NONE
   94:   tz.tz_dsttime = DST_NONE;
   95: #else
   96:   tz.tz_dsttime = 0;
   97: #endif
   98:   gettimeofday (&tv, &tz);
   99:   yet=tv.tv_sec + tv.tv_usec/1000000.0;
  100: #undef NEED_TIME
  101: #endif
  102: #ifdef HAVE_FTIME
  103: 	static int fbad=0;
  104: 
  105: 	if (! fbad)
  106: 	{
  107: 		struct timeb stime;
  108: 		static struct timeb slast;
  109: 
  110: 		(void) ftime (&stime);
  111: 
  112: 		/* On some systems, such as SCO 3.2.2, ftime can go backwards in
  113: 		   time.  If we detect this, we switch to using time.  */
  114: 		if (slast.time != 0
  115: 			&& (stime.time < slast.time
  116: 			|| (stime.time == slast.time && stime.millitm < slast.millitm)))
  117: 			fbad = 1;
  118: 		else
  119: 		{
  120: 			yet = stime.millitm / 1000.0  + stime.time;
  121: 			slast = stime;
  122: 		}
  123: 	}
  124: 	if (fbad)
  125: 		yet=(double) time(NULL);
  126: #undef NEED_TIME
  127: #endif
  128: 
  129: #ifdef HAVE_TIMES
  130:   struct tms s;
  131:   long i;
  132:   static int itick;
  133: 
  134:   if (itick == 0)
  135:     {
  136: #if TIMES_TICK == 0
  137: #if HAVE_SYSCONF && HAVE_SC_CLK_TCK
  138:       itick = (int) sysconf (_SC_CLK_TCK);
  139: #else /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
  140:       const char *z;
  141: 
  142:       z = getenv ("HZ");
  143:       if (z != NULL)
  144:         itick = (int) strtol (z, (char **) NULL, 10);
  145: 
  146:       /* If we really couldn't get anything, just use 60.  */
  147:       if (itick == 0)
  148:         itick = 60;
  149: #endif /* ! HAVE_SYSCONF || ! HAVE_SC_CLK_TCK */
  150: #else /* TIMES_TICK != 0 */
  151:       itick = TIMES_TICK;
  152: #endif /* TIMES_TICK == 0 */
  153:     }
  154:   yet = ((double) times (&s)) / itick;
  155: #undef NEED_TIME
  156: #endif
  157: 
  158: #ifdef NEED_TIME
  159: 	yet=(double) time(NULL);
  160: #endif
  161:   if (nowp)
  162:     *nowp=(time_t) yet;
  163:   if (reset) {
  164:     starttime = yet;
  165:     return starttime;
  166:   }
  167:   else {
  168:     stoptime = yet;
  169:     elaptime = stoptime - starttime;
  170:     return elaptime;
  171:   }
  172: }
  173: 
  174: /*#define TEST*/
  175: #ifdef TEST
  176: main()
  177: {
  178: 	int i;
  179: 	printf("timing %g\n",timing(1));
  180: 	printf("timing %g\n",timing(0));
  181: 	for(i=0;i<20;i++){
  182: 	sleep(1);
  183: 	printf("timing %g\n",timing(0));
  184: 	}
  185: }
  186: #endif

FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>