From db04688faa20f3576257c0fe41752ec435beab9a Mon Sep 17 00:00:00 2001 From: Bryan Newbold Date: Mon, 20 Feb 2017 00:05:25 -0800 Subject: Import Upstream version 5c3 --- time.c | 329 +++++++++++++++++++++++++++++++---------------------------------- 1 file changed, 159 insertions(+), 170 deletions(-) (limited to 'time.c') diff --git a/time.c b/time.c index 4b4368c..4d0d723 100644 --- a/time.c +++ b/time.c @@ -44,177 +44,146 @@ #include "scm.h" -#ifdef HAVE_CONFIG_H - -# ifndef HAVE_FTIME -# define LACK_FTIME +#ifdef STDC_HEADERS +# include +# ifdef M_SYSV +# include +# include # endif -# ifndef HAVE_TIMES -# define LACK_TIMES +# ifdef sun +# include +# include # endif -# ifdef HAVE_SYS_TYPES_H +# ifdef ultrix # include +# include # endif -# ifdef TIME_WITH_SYS_TIME -# include -# include -# else -# ifdef HAVE_SYS_TIME_H -# include -# else -# ifdef HAVE_TIME_H -# include -# endif -# endif +# ifdef nosve +# include +# include # endif -# ifdef HAVE_SYS_TIMES_H +# ifdef _UNICOS +# include # include -# else -# ifdef HAVE_SYS_TIMEB_H -# include -# endif # endif -# ifdef HAVE_FTIME -# ifdef unix -# ifndef GO32 -# include -# endif -# else -# ifdef __amigados__ -# include -# endif -# endif +# ifdef __IBMC__ +# include # endif - #else - -# ifdef STDC_HEADERS +# ifdef SVR2 # include -# ifdef M_SYSV -# include -# include -# endif -# ifdef sun -# include -# include -# endif -# ifdef ultrix -# include -# include -# endif -# ifdef nosve -# include -# include -# endif -# ifdef _UNICOS -# include -# include -# endif -# ifdef __IBMC__ -# include -# endif # else -# ifdef SVR2 -# include -# else -# ifndef ARM_ULIB -# include -# else -# include -# endif -# endif -# include - # ifndef ARM_ULIB -# include +# include # else # include # endif +# endif +# include +# ifndef ARM_ULIB +# include +# else +# include # endif +#endif + /* Define this if your system lacks ftime(). */ /* #define LACK_FTIME */ +/* Define this if your system has gettimeofday() + (LACK_FTIME should not be defined). */ +/* #define USE_GETTIMEOFDAY */ /* Define this if your system lacks times(). */ /* #define LACK_TIMES */ -# ifdef __TURBOC__ -# define LACK_TIMES -# endif -# if (__TURBOC__==1) /* Needed for TURBOC V1.0 */ -# define LACK_FTIME -# undef MSDOS -# endif -# ifdef __HIGHC__ -# define LACK_TIMES -# endif -# ifdef THINK_C -# define LACK_FTIME -# define LACK_TIMES -# define CLK_TCK 60 -# endif -# ifdef SVR2 -# define LACK_FTIME -# endif -# ifdef SVR4 -# define LACK_FTIME -# endif -# ifdef __svr4__ -# define LACK_FTIME -# endif -# ifdef nosve -# define LACK_FTIME -# endif -# ifdef GO32 -# define LACK_FTIME -# define LACK_TIMES -# endif -# ifdef atarist -# define LACK_FTIME -# define LACK_TIMES -# endif -# ifdef ARM_ULIB -# define LACK_FTIME -# define LACK_TIMES -# endif -# ifdef _DCC -# define LACK_FTIME +#ifdef linux +# include +# include +# include +# define USE_GETTIMEOFDAY +#endif +#ifdef freebsd +# include +# include +# include +# define USE_GETTIMEOFDAY +#endif +#ifdef __TURBOC__ +# define LACK_TIMES +#endif +#if (__TURBOC__==1) /* Needed for TURBOC V1.0 */ +# define LACK_FTIME +# undef MSDOS +#endif +#ifdef __HIGHC__ +# define LACK_TIMES +#endif +#ifdef macintosh +# define LACK_FTIME +# define LACK_TIMES +# define CLK_TCK 60 +#endif +#ifdef SVR2 +# define LACK_FTIME +#endif +#ifdef SVR4 +# define LACK_FTIME +#endif +#ifdef __svr4__ +# define LACK_FTIME +#endif +#ifdef nosve +# define LACK_FTIME +#endif +#ifdef GO32 +# define LACK_FTIME +# define LACK_TIMES +#endif +#ifdef atarist +# define LACK_FTIME +# define LACK_TIMES +#endif +#ifdef ARM_ULIB +# define LACK_FTIME +# define LACK_TIMES +#endif +#ifdef _DCC +# define LACK_FTIME +#endif +#ifdef MSDOS +# ifndef GO32 +# include +# include # endif -# ifdef MSDOS +#endif +#ifdef _UNICOS +# define LACK_FTIME +#endif + +#ifndef LACK_FTIME +# ifdef unix # ifndef GO32 -# include # include # endif # endif -# ifdef _UNICOS -# define LACK_FTIME -# endif - -# ifndef LACK_FTIME -# ifdef unix -# ifndef GO32 -# include -# endif -# endif -# endif - -# ifdef __EMX__ -# define LACK_TIMES -# include -# include -# endif +#endif -# ifdef MWC -# include -# include -# endif +#ifdef __EMX__ +# define LACK_TIMES +# include +# include +#endif -# ifdef ARM_ULIB -# include -# include -# endif +#ifdef MWC +# include +# include +#endif -#endif /* HAVE_CONFIG_H */ +#ifdef ARM_ULIB +# include +# include +#endif #ifdef vms # define LACK_TIMES @@ -327,18 +296,48 @@ SCM your_time() } # endif /* AMIGA */ #else /* LACK_FTIME */ +# ifdef USE_GETTIMEOFDAY +int scm_ftime(time_buffer) + struct timeb *time_buffer; +{ + struct timezone t_z; struct timeval t_v; + if (gettimeofday(&t_v, &t_z) < 0) return -1; + time_buffer->timezone = t_z.tz_minuteswest; + time_buffer->dstflag = t_z.tz_dsttime; + time_buffer->millitm = t_v.tv_usec / 1000; + time_buffer->time = t_v.tv_sec; + return 0;} +# else /* USE_GETTIMEOFDAY */ +# define scm_ftime ftime +# endif /* USE_GETTIMEOFDAY */ struct timeb your_base = {0}; +# define TIMETRIES 10 SCM your_time() { - struct timeb time_buffer; - long tmp; - ftime(&time_buffer); - time_buffer.time -= your_base.time; - tmp = time_buffer.millitm - your_base.millitm; - tmp = time_buffer.time*1000L + tmp; - tmp *= CLKTCK; - tmp /= 1000; - return MAKINUM(tmp); + long tmp; + struct timeb time_buffer1; + struct timeb time_buffer2; + int cnt = 0; + tryagain: + cnt++; + scm_ftime(&time_buffer1); + scm_ftime(&time_buffer2); + if (time_buffer1.time==time_buffer2.time) { + if (time_buffer1.millitm > time_buffer2.millitm) + time_buffer2.time = time_buffer2.time + 1; + } + else if ((1 + time_buffer1.time)==time_buffer2.time) ; + else if (cnt < TIMETRIES) goto tryagain; + else { + warn("could not read two ftime()s within one second in 10 tries",0L); + return MAKINUM(-1); + } + time_buffer2.time -= your_base.time; + tmp = time_buffer2.millitm - your_base.millitm; + tmp = time_buffer2.time*1000L + tmp; + tmp *= CLKTCK; + tmp /= 1000; + return MAKINUM(tmp); } #endif /* LACK_FTIME */ @@ -377,32 +376,22 @@ static iproc subr0s[] = { {"current-time", curtime}, {0, 0}}; -void init_time() +void reset_time() { - sysintern("internal-time-units-per-second", - MAKINUM((long)CLKTCK)); #ifdef LACK_FTIME # ifndef AMIGA - if (!your_base) time(&your_base); + time(&your_base); # endif #else - if (!your_base.time) ftime(&your_base); + scm_ftime(&your_base); #endif - if (!my_base) my_base = mytime(); - init_iprocs(subr0s, tc7_subr_0); + my_base = 0; + my_base = mytime(); } -#ifdef freebsd -# include -# include -# include -int ftime(time_buffer) - struct timeb *time_buffer; +void init_time() { - struct timezone t_z; struct timeval t_v; - if (gettimeofday(&t_v, &t_z) < 0) return -1; - time_buffer->timezone = t_z.tz_minuteswest; - time_buffer->dstflag = t_z.tz_dsttime; - time_buffer->millitm = t_v.tv_usec / 1000; - time_buffer->time = t_v.tv_sec; - return 0;} -#endif + sysintern("internal-time-units-per-second", + MAKINUM((long)CLKTCK)); + reset_time(); + init_iprocs(subr0s, tc7_subr_0); +} -- cgit v1.2.3