version 1.4, 1995/02/25 15:39:52 |
version 1.19, 2008/04/28 20:22:59 |
|
|
/* $NetBSD$ */ |
/* $NetBSD$ */ |
|
|
/* |
/*- |
* Copyright (c) 1989, 1993 |
* Copyright (c) 1997 The NetBSD Foundation, Inc. |
* The Regents of the University of California. All rights reserved. |
* All rights reserved. |
|
* |
|
* This code is derived from software contributed to The NetBSD Foundation |
|
* by J.T. Conklin. |
* |
* |
* Redistribution and use in source and binary forms, with or without |
* Redistribution and use in source and binary forms, with or without |
* modification, are permitted provided that the following conditions |
* modification, are permitted provided that the following conditions |
|
|
* 2. Redistributions in binary form must reproduce the above copyright |
* 2. Redistributions in binary form must reproduce the above copyright |
* notice, this list of conditions and the following disclaimer in the |
* notice, this list of conditions and the following disclaimer in the |
* documentation and/or other materials provided with the distribution. |
* documentation and/or other materials provided with the distribution. |
* 3. All advertising materials mentioning features or use of this software |
|
* must display the following acknowledgement: |
|
* This product includes software developed by the University of |
|
* California, Berkeley and its contributors. |
|
* 4. Neither the name of the University nor the names of its contributors |
|
* may be used to endorse or promote products derived from this software |
|
* without specific prior written permission. |
|
* |
* |
* THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND |
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS |
* ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE |
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED |
* IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE |
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR |
* ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE |
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS |
* FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL |
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR |
* DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS |
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF |
* OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) |
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS |
* HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT |
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN |
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY |
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) |
* OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF |
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE |
* SUCH DAMAGE. |
* POSSIBILITY OF SUCH DAMAGE. |
*/ |
*/ |
|
|
|
#include <sys/cdefs.h> |
#if defined(LIBC_SCCS) && !defined(lint) |
#if defined(LIBC_SCCS) && !defined(lint) |
#if 0 |
__RCSID("$NetBSD$"); |
static char sccsid[] = "@(#)usleep.c 8.1 (Berkeley) 6/4/93"; |
|
#else |
|
static char rcsid[] = "$NetBSD$"; |
|
#endif |
|
#endif /* LIBC_SCCS and not lint */ |
#endif /* LIBC_SCCS and not lint */ |
|
|
#include <sys/time.h> |
#include "namespace.h" |
#include <sys/signal.h> |
#include <errno.h> |
|
#include <time.h> |
#include <unistd.h> |
#include <unistd.h> |
|
|
#define TICK 10000 /* system clock resolution in microseconds */ |
#ifdef __weak_alias |
#define USPS 1000000 /* number of microseconds in a second */ |
__weak_alias(usleep,_usleep) |
|
#endif |
#define setvec(vec, a) \ |
|
vec.sv_handler = a; vec.sv_mask = vec.sv_onstack = 0 |
|
|
|
static int ringring; |
|
|
|
void |
int |
usleep(useconds) |
usleep(useconds) |
unsigned int useconds; |
useconds_t useconds; |
{ |
{ |
register struct itimerval *itp; |
struct timespec ts; |
struct itimerval itv, oitv; |
|
struct sigvec vec, ovec; |
if (useconds == 0) |
long omask; |
return (0); |
static void sleephandler(); |
|
|
if (useconds >= 1000000) { |
itp = &itv; |
errno = EINVAL; |
if (!useconds) |
return (-1); |
return; |
|
timerclear(&itp->it_interval); |
|
timerclear(&itp->it_value); |
|
if (setitimer(ITIMER_REAL, itp, &oitv) < 0) |
|
return; |
|
itp->it_value.tv_sec = useconds / USPS; |
|
itp->it_value.tv_usec = useconds % USPS; |
|
if (timerisset(&oitv.it_value)) { |
|
if (timercmp(&oitv.it_value, &itp->it_value, >)) { |
|
oitv.it_value.tv_sec -= itp->it_value.tv_sec; |
|
oitv.it_value.tv_usec -= itp->it_value.tv_usec; |
|
if (oitv.it_value.tv_usec < 0) { |
|
oitv.it_value.tv_usec += USPS; |
|
oitv.it_value.tv_sec--; |
|
} |
|
} else { |
|
itp->it_value = oitv.it_value; |
|
oitv.it_value.tv_sec = 0; |
|
oitv.it_value.tv_usec = 2 * TICK; |
|
} |
|
} |
} |
setvec(vec, sleephandler); |
|
(void) sigvec(SIGALRM, &vec, &ovec); |
|
omask = sigblock(sigmask(SIGALRM)); |
|
ringring = 0; |
|
(void) setitimer(ITIMER_REAL, itp, (struct itimerval *)0); |
|
while (!ringring) |
|
sigpause(omask &~ sigmask(SIGALRM)); |
|
(void) sigvec(SIGALRM, &ovec, (struct sigvec *)0); |
|
(void) sigsetmask(omask); |
|
(void) setitimer(ITIMER_REAL, &oitv, (struct itimerval *)0); |
|
} |
|
|
|
static void |
ts.tv_sec = 0; |
sleephandler() |
ts.tv_nsec = useconds * 1000; |
{ |
|
ringring = 1; |
nanosleep(&ts, NULL); |
|
|
|
return (0); |
} |
} |