diff options
author | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-06-09 01:15:10 +0200 |
---|---|---|
committer | Samuel Thibault <samuel.thibault@ens-lyon.org> | 2016-06-09 01:15:22 +0200 |
commit | 230b85f414291ac955827aba15cfbd103ab6ebdd (patch) | |
tree | f06efad644b786a66439d28ac4d10ad6eda9d7de /hurd/hurdsock.c | |
parent | aec94e76f0c0e63a8c777ed8324007eed62a9f68 (diff) |
Fix pipe() call returning EINTR sometimes
because it uses a critical section
Diffstat (limited to 'hurd/hurdsock.c')
-rw-r--r-- | hurd/hurdsock.c | 5 |
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; } |