runtime: handle KERN_ABORTED in the darwin semaphore implementation
authorNikodemus Siivola <nikodemus@random-state.net>
Wed, 7 Dec 2011 09:26:45 +0000 (11:26 +0200)
committerNikodemus Siivola <nikodemus@random-state.net>
Fri, 30 Dec 2011 21:06:59 +0000 (23:06 +0200)
  Analogous to EINTR.

src/runtime/darwin-os.c

index df53e98..568bbc7 100644 (file)
@@ -193,11 +193,19 @@ os_sem_wait(os_sem_t *sem, char *what)
     switch (ret) {
     case KERN_SUCCESS:
         return;
+        /* It is unclear just when we can get this, but a sufficiently
+         * long wait seems to do that, at least sometimes.
+         *
+         * However, a wait that long is definitely abnormal for the
+         * GC, so we complain before retrying.
+         */
     case KERN_OPERATION_TIMED_OUT:
         fprintf(stderr, "%s: os_sem_wait(%p): %s", what, sem, strerror(errno));
+        /* This is analogous to POSIX EINTR. */
+    case KERN_ABORTED:
         goto restart;
     default:
-        lose("%s: os_sem_wait(%p): %s", what, sem, strerror(errno));
+        lose("%s: os_sem_wait(%p): %lu, %s", what, sem, ret, strerror(errno));
     }
 }