comparison lib/sleep.c @ 12326:25e64e77bb53

sleep: work around cygwin bug On cygwin 1.5.x, sleep amounts larger than 49.7 days (2**32 milliseconds) failed instantly, but with a garbage return value from uninitialized memory. * lib/sleep.c (rpl_sleep): Work around the bug. * m4/sleep.m4 (gl_FUNC_SLEEP): Detect the bug. (gl_PREREQ_SLEEP): Delete unused macro. * modules/sleep (Depends-on): Add verify. * m4/unistd_h.m4 (gl_UNISTD_H_DEFAULTS): Add default. * modules/unistd (Makefile.am): Substitute witness. * lib/unistd.in.h (sleep): Update prototype. * doc/posix-functions/sleep.texi (sleep): Document the bug. * tests/test-sleep.c (main) [HAVE_DECL_ALARM]: Test it. * modules/sleep-tests (Depends-on): Check for alarm. Signed-off-by: Eric Blake <ebb9@byu.net>
author Eric Blake <ebb9@byu.net>
date Wed, 18 Nov 2009 20:07:44 -0700
parents bbbbbf4cd1c5
children c2cbabec01dd
comparison
equal deleted inserted replaced
12325:444e305ec8cc 12326:25e64e77bb53
1 /* Pausing execution of the current thread. 1 /* Pausing execution of the current thread.
2 Copyright (C) 2007 Free Software Foundation, Inc. 2 Copyright (C) 2007, 2009 Free Software Foundation, Inc.
3 Written by Bruno Haible <bruno@clisp.org>, 2007. 3 Written by Bruno Haible <bruno@clisp.org>, 2007.
4 4
5 This program is free software: you can redistribute it and/or modify 5 This program is free software: you can redistribute it and/or modify
6 it under the terms of the GNU General Public License as published by 6 it under the terms of the GNU General Public License as published by
7 the Free Software Foundation; either version 3 of the License, or 7 the Free Software Foundation; either version 3 of the License, or
18 #include <config.h> 18 #include <config.h>
19 19
20 /* Specification. */ 20 /* Specification. */
21 #include <unistd.h> 21 #include <unistd.h>
22 22
23 #include <limits.h>
24
25 #include "verify.h"
26
23 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ 27 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__
24 28
25 # define WIN32_LEAN_AND_MEAN /* avoid including junk */ 29 # define WIN32_LEAN_AND_MEAN /* avoid including junk */
26 # include <windows.h> 30 # include <windows.h>
27 31
37 Sleep (1000); 41 Sleep (1000);
38 42
39 return remaining; 43 return remaining;
40 } 44 }
41 45
42 #else 46 #elif HAVE_SLEEP
47
48 # undef sleep
49
50 /* Guarantee unlimited sleep and a reasonable return value. Cygwin
51 1.5.x rejects attempts to sleep more than 49.7 days (2**32
52 milliseconds), but uses uninitialized memory which results in a
53 garbage answer. */
54 unsigned int
55 rpl_sleep (unsigned int seconds)
56 {
57 /* This requires int larger than 16 bits. */
58 verify (UINT_MAX / 49 / 24 / 60 / 60);
59 const unsigned int limit = 49 * 24 * 60 * 60;
60 while (limit < seconds)
61 {
62 unsigned int result;
63 seconds -= limit;
64 result = sleep (limit);
65 if (result)
66 return seconds + result;
67 }
68 return sleep (seconds);
69 }
70
71 #else /* !HAVE_SLEEP */
43 72
44 #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib." 73 #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."
45 74
46 #endif 75 #endif