Cope with signals interrupting the nanosleep of nmsleep.
diff --git a/util.c b/util.c
index 01cbb20..c6b8204 100644
--- a/util.c
+++ b/util.c
@@ -692,9 +692,14 @@ void thr_info_cancel(struct thr_info *thr)
* on SMP machines */
void nmsleep(unsigned int msecs)
{
- struct timespec twait;
-
- twait.tv_sec = msecs / 1000;
- twait.tv_nsec = (uint64_t)(msecs * 1000000) - (uint64_t)(twait.tv_sec / 1000000000);
- nanosleep(&twait, NULL);
+ struct timespec twait, tleft;
+ int ret;
+
+ tleft.tv_sec = msecs / 1000;
+ tleft.tv_nsec = (uint64_t)(msecs * 1000000) - (uint64_t)(twait.tv_sec / 1000000000);
+ do {
+ twait.tv_sec = tleft.tv_sec;
+ twait.tv_nsec = tleft.tv_nsec;
+ ret = nanosleep(&twait, &tleft);
+ } while (ret == -1 && errno == EINTR);
}