Logo Search packages:      
Sourcecode: xabacus version File versions  Download package

timer.c

/*-
#
#  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 <X11/unix_time.h>
#endif
#if HAVE_SYS_TIME_H
#include <sys/time.h>
#else
#if HAVE_SYS_SELECT_H
#include <sys/select.h>
#endif
#endif
#endif
#if defined(SYSV) || defined(SVR4)
#ifdef LESS_THAN_AIX3_2
#include <sys/poll.h>
#else /* !LESS_THAN_AIX3_2 */
#include <poll.h>
#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
}

Generated by  Doxygen 1.6.0   Back to index