[BACK]Return to usleep.c CVS log [TXT][DIR] Up to [cvs.NetBSD.org] / src / lib / libc / gen

Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.

Diff for /src/lib/libc/gen/usleep.c between version 1.4 and 1.19

version 1.4, 1995/02/25 15:39:52 version 1.19, 2008/04/28 20:22:59
Line 1 
Line 1 
 /*      $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
Line 12 
Line 15 
  * 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);
 }  }

Legend:
Removed from v.1.4  
changed lines
  Added in v.1.19

CVSweb <webmaster@jp.NetBSD.org>