{
/*
* Windows' Sleep() takes a DWORD argument, which is smaller than
- * a uint64_t, so we need to split the two to shut the compiler up.
+ * a uint64_t, so we need to limit it to 49 days, which should be enough.
*/
- DWORD dword_times;
- DWORD i;
+ DWORD limited_millis = (DWORD)-1;
- dword_times = (DWORD)(millis >> (8 * sizeof(DWORD)));
- millis &= (DWORD)-1;
- if (dword_times > 0) {
- for (i = dword_times; i-- > 0;)
- Sleep((DWORD)-1);
- /*
- * The loop above slept 1 millisec less on each iteration than it
- * should, this compensates by sleeping as many milliseconds as there
- * were iterations. Yes, this is nit picky!
- */
- Sleep(dword_times);
- }
-
- /* Now, sleep the remaining milliseconds */
- Sleep((DWORD)(millis));
+ if (millis < limited_millis)
+ limited_millis = (DWORD)millis;
+ Sleep(limited_millis);
}
+
#else
/* Fallback to a busy wait */
# include "internal/time.h"
{
/*
* sleep() takes an unsigned int argument, which is smaller than
- * a uint64_t, so it needs to be called in smaller increments.
+ * a uint64_t, so it needs to be limited to 136 years which
+ * should be enough even for Sleeping Beauty.
*/
- unsigned int uint_times;
- unsigned int i;
+ unsigned int limited_secs = UINT_MAX;
- uint_times = (unsigned int)(secs >> (8 * sizeof(unsigned int)));
- if (uint_times > 0) {
- for (i = uint_times; i-- > 0;)
- sleep((unsigned int)-1);
- /*
- * The loop above slept 1 second less on each iteration than it
- * should, this compensates by sleeping as many seconds as there were
- * iterations. Yes, this is nit picky!
- */
- sleep(uint_times);
- }
+ if (secs < limited_secs)
+ limited_secs = (unsigned int)secs;
+ sleep(limited_secs);
}
static void ossl_sleep_millis(uint64_t millis)
OSSL_sleep() is a convenience function to delay execution of the calling
thread for (at least) I<millis> milliseconds. The delay is not guaranteed;
-it may be affected by system activity, by the time spent processing the call
-or by system timer granularity.
+it may be affected by system activity, by the time spent processing the call,
+limitation on the underlying system call parameter size or by system timer
+granularity.
+
+In particular on Windows the maximum amount of time it will sleep is
+49 days and on systems where the regular sleep(3) is used as the underlying
+system call the maximum sleep time is about 136 years.
=head1 RETURN VALUES