Browse Source

Cope with signals interrupting the nanosleep of nmsleep.

Con Kolivas 13 years ago
parent
commit
bc0b14063f
1 changed files with 10 additions and 5 deletions
  1. 10 5
      util.c

+ 10 - 5
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);
 }