X-Git-Url: http://erislabs.net/gitweb/?a=blobdiff_plain;f=lib%2Fsleep.c;fp=lib%2Fsleep.c;h=90b482c14695fe223c269fc4c63264b4d672cf2d;hb=6baa46639c17d7fba1d6aa1a3dd8ed536b7b2dc9;hp=9c56b9b81d346a39fc4ac592813744d7c222bcea;hpb=00b2f10b68593189be4eb1affd88de33a8e92fb3;p=gnulib.git diff --git a/lib/sleep.c b/lib/sleep.c index 9c56b9b81..90b482c14 100644 --- a/lib/sleep.c +++ b/lib/sleep.c @@ -1,5 +1,5 @@ /* Pausing execution of the current thread. - Copyright (C) 2007 Free Software Foundation, Inc. + Copyright (C) 2007, 2009 Free Software Foundation, Inc. Written by Bruno Haible , 2007. This program is free software: you can redistribute it and/or modify @@ -20,6 +20,10 @@ /* Specification. */ #include +#include + +#include "verify.h" + #if (defined _WIN32 || defined __WIN32__) && ! defined __CYGWIN__ # define WIN32_LEAN_AND_MEAN /* avoid including junk */ @@ -39,7 +43,32 @@ sleep (unsigned int seconds) return remaining; } -#else +#elif HAVE_SLEEP + +# undef sleep + +/* Guarantee unlimited sleep and a reasonable return value. Cygwin + 1.5.x rejects attempts to sleep more than 49.7 days (2**32 + milliseconds), but uses uninitialized memory which results in a + garbage answer. */ +unsigned int +rpl_sleep (unsigned int seconds) +{ + /* This requires int larger than 16 bits. */ + verify (UINT_MAX / 49 / 24 / 60 / 60); + const unsigned int limit = 49 * 24 * 60 * 60; + while (limit < seconds) + { + unsigned int result; + seconds -= limit; + result = sleep (limit); + if (result) + return seconds + result; + } + return sleep (seconds); +} + +#else /* !HAVE_SLEEP */ #error "Please port gnulib sleep.c to your platform, possibly using usleep() or select(), then report this to bug-gnulib."