/*- # # timer.c # ### # # Copyright (c) 2005 David Albert Bagley, bagleyd@tux.org # # All Rights Reserved # # Permission to use, copy, modify, and distribute this software and # its documentation for any purpose and without fee is hereby granted, # provided that the above copyright notice appear in all copies and # that both that copyright notice and this permission notice appear in # supporting documentation, and that the name of the author not be # used in advertising or publicity pertaining to distribution of the # software without specific, written prior permission. # # This program is distributed in the hope that it will be "playable", # but WITHOUT ANY WARRANTY; without even the implied warranty of # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. # */ /* Methods file for timer */ #include "timer.h" #ifndef WINVER #ifndef HAVE_USLEEP #if !defined( VMS ) || defined( XVMSUTILS ) || ( __VMS_VER >= 70000000 ) #ifdef USE_XVMSUTILS #include #endif #if HAVE_SYS_TIME_H #include #else #if HAVE_SYS_SELECT_H #include #endif #endif #endif #if defined(SYSV) || defined(SVR4) #ifdef LESS_THAN_AIX3_2 #include #else /* !LESS_THAN_AIX3_2 */ #include #endif /* !LESS_THAN_AIX3_2 */ #endif /* defined(SYSV) || defined(SVR4) */ /* not static in case usleep found in system include */ int usleep(unsigned int usec) { #if (defined (SYSV) || defined(SVR4)) && !defined(__hpux) #if defined(HAVE_NANOSLEEP) { struct timespec rqt; rqt.tv_nsec = 1000 * (usec % (unsigned int) 1000000); rqt.tv_sec = usec / (unsigned int) 1000000; return nanosleep(&rqt, NULL); } #else (void) poll( #if defined(__cplusplus) || defined(c_plusplus) (pollfd *) /* guess */ #else (void *) #endif 0, (int) 0, usec / 1000); /* ms resolution */ #endif #else #ifdef VMS long timadr[2]; if (usec != 0) { timadr[0] = -usec * 10; timadr[1] = -1; sys$setimr(4, &timadr, 0, 0, 0); sys$waitfr(4); } #else struct timeval time_out; #if 0 /* (!defined(AIXV3) && !defined(__hpux)) */ extern int select(int, fd_set *, fd_set *, fd_set *, struct timeval *); #endif time_out.tv_usec = usec % (unsigned int) 1000000; time_out.tv_sec = usec / (unsigned int) 1000000; (void) select(0, (void *) 0, (void *) 0, (void *) 0, &time_out); #endif #endif return 0; } #endif #if (!defined(WINVER) || (WINVER <= 0x030a)) /* if X or WINDOWS 3.1 or less */ void Sleep(unsigned int cMilliseconds) { #if (defined(WINVER) && (WINVER <= 0x030a)) unsigned long time_out = GetTickCount() + cMilliseconds; while (time_out > GetTickCount()); #else (void) usleep(cMilliseconds * 1000); #endif } #endif #endif void useTimer(TimeVal * oldTime, int delay) { int sleepTime; #ifdef WINVER long tv = GetTickCount(); sleepTime = delay - (tv - (*oldTime)); *oldTime = tv; if (sleepTime > 0) { Sleep((unsigned int) sleepTime); } #else struct timeval tv; (void) X_GETTIMEOFDAY(&tv); sleepTime = delay * 1000 - ((tv.tv_sec - (*oldTime).tv_sec) * 1000000 + tv.tv_usec - (*oldTime).tv_usec); (*oldTime).tv_sec = tv.tv_sec; (*oldTime).tv_usec = tv.tv_usec; if (sleepTime > 0) { (void) usleep((unsigned int) sleepTime); } #endif }