sleep.c (30493) | sleep.c (30510) |
---|---|
1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) | 1/* 2 * Copyright (c) 1989, 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * Redistribution and use in source and binary forms, with or without 6 * modification, are permitted provided that the following conditions 7 * are met: 8 * 1. Redistributions of source code must retain the above copyright --- 18 unchanged lines hidden (view full) --- 27 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 28 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 29 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 30 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 31 * SUCH DAMAGE. 32 */ 33 34#if defined(LIBC_SCCS) && !defined(lint) |
35#if 0 |
|
35static char sccsid[] = "@(#)sleep.c 8.1 (Berkeley) 6/4/93"; | 36static char sccsid[] = "@(#)sleep.c 8.1 (Berkeley) 6/4/93"; |
37#endif 38static char rcsid[] = 39 "$Id$"; |
|
36#endif /* LIBC_SCCS and not lint */ 37 | 40#endif /* LIBC_SCCS and not lint */ 41 |
42#include <errno.h> 43#include <limits.h> |
|
38#include <time.h> 39#include <unistd.h> 40 41unsigned int 42sleep(seconds) 43 unsigned int seconds; 44{ 45 struct timespec time_to_sleep; 46 struct timespec time_remaining; 47 | 44#include <time.h> 45#include <unistd.h> 46 47unsigned int 48sleep(seconds) 49 unsigned int seconds; 50{ 51 struct timespec time_to_sleep; 52 struct timespec time_remaining; 53 |
48 if (seconds != 0) { 49 time_to_sleep.tv_sec = seconds; 50 time_to_sleep.tv_nsec = 0; 51 time_remaining = time_to_sleep; 52 (void)nanosleep(&time_to_sleep, &time_remaining); 53 seconds = time_remaining.tv_sec; 54 if (time_remaining.tv_nsec > 0) 55 seconds++; /* round up */ 56 } 57 return (seconds); | 54 /* 55 * Avoid overflow when `seconds' is huge. This assumes that 56 * the maximum value for a time_t is >= LONG_MAX. 57 */ 58 if (seconds > LONG_MAX) 59 return (seconds - LONG_MAX + sleep(LONG_MAX)); 60 61 time_to_sleep.tv_sec = seconds; 62 time_to_sleep.tv_nsec = 0; 63 if (nanosleep(&time_to_sleep, &time_remaining) != -1) 64 return (0); 65 if (errno != EINTR) 66 return (seconds); /* best guess */ 67 return (time_remaining.tv_sec + 68 (time_remaining.tv_nsec != 0)); /* round up */ |
58} | 69} |