Mercurial > hg > octave-kai > gnulib-hg
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 |