1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132
|
/* @(#)usleep.c 1.15 01/01/07 Copyright 1995 J. Schilling */
#ifndef lint
static char sccsid[] =
"@(#)usleep.c 1.15 01/01/07 Copyright 1995 J. Schilling";
#endif
/*
* Copyright (c) 1995 J. Schilling
*/
/*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation; either version 2, or (at your option)
* any later version.
*
* This program 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 General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; see the file COPYING. If not, write to
* the Free Software Foundation, 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <mconfig.h>
#include <standard.h>
#include <stdxlib.h>
#include <timedefs.h>
#ifdef HAVE_POLL_H
# include <poll.h>
#else
# ifdef HAVE_SYS_POLL_H
# include <sys/poll.h>
# endif
#endif
#ifdef HAVE_SYS_SYSTEMINFO_H
#include <sys/systeminfo.h>
#endif
#include <libport.h>
/*
* SCO has a usleep() prototype in unistd.h
* So we put this prototype before the #undef HAVE_USLEEP
*/
#ifndef HAVE_USLEEP
EXPORT int usleep __PR((int usec));
#endif
#ifdef OPENSERVER
/*
* Don't use the usleep() from libc on SCO's OPENSERVER.
* It will kill our processes with SIGALRM.
*/
#undef HAVE_USLEEP
#endif
#ifdef apollo
/*
* Apollo sys5.3 usleep is broken. Define a version based on time_$wait.
*/
#include <apollo/base.h>
#include <apollo/time.h>
#undef HAVE_USLEEP
#endif
#if !defined(HAVE_USLEEP)
EXPORT int
usleep(usec)
int usec;
{
#if defined(apollo)
/*
* Need to check apollo before HAVE_SELECT, because Apollo has select,
* but it's time wait feature is also broken :-(
*/
#define HAVE_USLEEP
/*
* XXX Do these vars need to be static on Domain/OS ???
*/
static time_$clock_t DomainDelay;
static status_$t DomainStatus;
/*
* DomainDelay is a 48 bit value that defines how many 4uS periods to
* delay. Since the input value range is 32 bits, the upper 16 bits of
* DomainDelay must be zero. So we just divide the input value by 4 to
* determine how many "ticks" to wait
*/
DomainDelay.c2.high16 = 0;
DomainDelay.c2.low32 = usec / 4;
time_$wait (time_$relative, DomainDelay, &DomainStatus);
#endif /* Apollo */
#if defined(HAVE_SELECT) && !defined(HAVE_USLEEP)
#define HAVE_USLEEP
struct timeval tv;
tv.tv_sec = usec / 1000000;
tv.tv_usec = usec % 1000000;
select(0, 0, 0, 0, &tv);
#endif
#if defined(HAVE_POLL) && !defined(HAVE_USLEEP)
#define HAVE_USLEEP
if (poll(0, 0, usec/1000) < 0)
comerr("poll delay failed.\n");
#endif
#if defined(HAVE_NANOSLEEP) && !defined(HAVE_USLEEP)
#define HAVE_USLEEP
struct timespec ts;
ts.tv_sec = usec / 1000000;
ts.tv_nsec = (usec % 1000000) * 1000;
nanosleep(&ts, 0);
#endif
#if !defined(HAVE_USLEEP)
#define HAVE_USLEEP
sleep((usec+500000)/1000000);
#endif
return (0);
}
#endif
|