Mercurial > hg > octave-kai > gnulib-hg
annotate 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 (2009-11-19) |
parents | bbbbbf4cd1c5 |
children | c2cbabec01dd |
rev | line source |
---|---|
8786 | 1 /* Pausing execution of the current thread. |
12326 | 2 Copyright (C) 2007, 2009 Free Software Foundation, Inc. |
8786 | 3 Written by Bruno Haible <bruno@clisp.org>, 2007. |
4 | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8786
diff
changeset
|
5 This program is free software: you can redistribute it and/or modify |
8786 | 6 it under the terms of the GNU General Public License as published by |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8786
diff
changeset
|
7 the Free Software Foundation; either version 3 of the License, or |
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8786
diff
changeset
|
8 (at your option) any later version. |
8786 | 9 |
10 This program is distributed in the hope that it will be useful, | |
11 but WITHOUT ANY WARRANTY; without even the implied warranty of | |
12 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the | |
13 GNU General Public License for more details. | |
14 | |
15 You should have received a copy of the GNU General Public License | |
9309
bbbbbf4cd1c5
Change copyright notice from GPLv2+ to GPLv3+.
Bruno Haible <bruno@clisp.org>
parents:
8786
diff
changeset
|
16 along with this program. If not, see <http://www.gnu.org/licenses/>. */ |
8786 | 17 |
18 #include <config.h> | |
19 | |
20 /* Specification. */ | |
21 #include <unistd.h> | |
22 | |
12326 | 23 #include <limits.h> |
24 | |
25 #include "verify.h" | |
26 | |
8786 | 27 #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ |
28 | |
29 # define WIN32_LEAN_AND_MEAN /* avoid including junk */ | |
30 # include <windows.h> | |
31 | |
32 unsigned int | |
33 sleep (unsigned int seconds) | |
34 { | |
35 unsigned int remaining; | |
36 | |
37 /* Sleep for 1 second many times, because | |
38 1. Sleep is not interruptiple by Ctrl-C, | |
39 2. we want to avoid arithmetic overflow while multiplying with 1000. */ | |
40 for (remaining = seconds; remaining > 0; remaining--) | |
41 Sleep (1000); | |
42 | |
43 return remaining; | |
44 } | |
45 | |
12326 | 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 */ | |
8786 | 72 |
73 #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib." | |
74 | |
75 #endif |