about summary refs log tree commit diff
path: root/library/std/src/sys/unix/mod.rs
diff options
context:
space:
mode:
Diffstat (limited to 'library/std/src/sys/unix/mod.rs')
-rw-r--r--library/std/src/sys/unix/mod.rs15
1 files changed, 8 insertions, 7 deletions
diff --git a/library/std/src/sys/unix/mod.rs b/library/std/src/sys/unix/mod.rs
index 0f06811a1d6..852f5dec31a 100644
--- a/library/std/src/sys/unix/mod.rs
+++ b/library/std/src/sys/unix/mod.rs
@@ -88,14 +88,15 @@ pub unsafe fn init(argc: isize, argv: *const *const u8) {
             ];
 
             while libc::poll(pfds.as_mut_ptr(), 3, 0) == -1 {
-                if errno() == libc::EINTR {
-                    continue;
-                }
-                if errno() == libc::EINVAL {
-                    // RLIMIT_NOFILE may be preventing use of poll()
-                    break 'poll;
+                match errno() {
+                    libc::EINTR => continue,
+                    libc::EINVAL | libc::EAGAIN | libc::ENOMEM => {
+                        // RLIMIT_NOFILE or temporary allocation failures
+                        // may be preventing use of poll(), fall back to fcntl
+                        break 'poll;
+                    }
+                    _ => libc::abort(),
                 }
-                libc::abort();
             }
             for pfd in pfds {
                 if pfd.revents & libc::POLLNVAL == 0 {