/* system-specific variants defining OSSL_sleep() */
#if defined(OPENSSL_SYS_UNIX) || defined(__DJGPP__)
-#include <unistd.h>
+# if defined(OPENSSL_USE_USLEEP) \
+ || defined(__DJGPP__) \
+ || (defined(__TANDEM) && defined(_REENTRANT))
+
+/*
+ * usleep() was made obsolete by POSIX.1-2008, and nanosleep()
+ * should be used instead. However, nanosleep() isn't implemented
+ * on the platforms given above, so we still use it for those.
+ * Also, OPENSSL_USE_USLEEP can be defined to enable the use of
+ * usleep, if it turns out that nanosleep() is unavailable.
+ */
+
+# include <unistd.h>
void OSSL_sleep(uint64_t millis)
{
-# ifdef OPENSSL_SYS_VXWORKS
- struct timespec ts;
+ unsigned int s = (unsigned int)(millis / 1000);
+ unsigned int us = (unsigned int)((millis % 1000) * 1000);
+
+ if (s > 0)
+ sleep(s);
+ /*
+ * On NonStop with the PUT thread model, thread context switch is
+ * cooperative, with usleep() being a "natural" context switch point.
+ * We avoid checking us > 0 here, to allow that context switch to
+ * happen.
+ */
+ usleep(us);
+}
- ts.tv_sec = (long int) (millis / 1000);
- ts.tv_nsec = (long int) (millis % 1000) * 1000000ul;
- nanosleep(&ts, NULL);
# elif defined(__TANDEM) && !defined(_REENTRANT)
-# include <cextdecs.h(PROCESS_DELAY_)>
+# include <cextdecs.h(PROCESS_DELAY_)>
+void OSSL_sleep(uint64_t millis)
+{
/* HPNS does not support usleep for non threaded apps */
PROCESS_DELAY_(millis * 1000);
+}
+
# else
- unsigned int s = (unsigned int)(millis / 1000);
- unsigned int us = (unsigned int)((millis % 1000) * 1000);
- if (s > 0)
- sleep(s);
- usleep(us);
-# endif
+/* nanosleep is defined by POSIX.1-2001 */
+# include <time.h>
+void OSSL_sleep(uint64_t millis)
+{
+ struct timespec ts;
+
+ ts.tv_sec = (long int) (millis / 1000);
+ ts.tv_nsec = (long int) (millis % 1000) * 1000000ul;
+ nanosleep(&ts, NULL);
}
+
+# endif
#elif defined(_WIN32) && !defined(OPENSSL_SYS_UEFI)
# include <windows.h>