summaryrefslogtreecommitdiff
path: root/hurd/hurdsock.c
diff options
context:
space:
mode:
authorSamuel Thibault <samuel.thibault@ens-lyon.org>2016-06-09 01:15:10 +0200
committerSamuel Thibault <samuel.thibault@ens-lyon.org>2016-06-09 01:15:22 +0200
commit230b85f414291ac955827aba15cfbd103ab6ebdd (patch)
treef06efad644b786a66439d28ac4d10ad6eda9d7de /hurd/hurdsock.c
parentaec94e76f0c0e63a8c777ed8324007eed62a9f68 (diff)
Fix pipe() call returning EINTR sometimes
because it uses a critical section
Diffstat (limited to 'hurd/hurdsock.c')
-rw-r--r--hurd/hurdsock.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/hurd/hurdsock.c b/hurd/hurdsock.c
index 0f52f37636..261f65450c 100644
--- a/hurd/hurdsock.c
+++ b/hurd/hurdsock.c
@@ -52,6 +52,7 @@ _hurd_socket_server (int domain, int dead)
return MACH_PORT_NULL;
}
+retry:
HURD_CRITICAL_BEGIN;
__mutex_lock (&lock);
@@ -102,6 +103,10 @@ _hurd_socket_server (int domain, int dead)
__mutex_unlock (&lock);
HURD_CRITICAL_END;
+ if (!server && errno == EINTR)
+ /* Got a signal while inside an RPC of the critical section, retry again */
+ goto retry;
+
return server;
}