diff options
Diffstat (limited to 'library/std/src/sys/unix/mod.rs')
| -rw-r--r-- | library/std/src/sys/unix/mod.rs | 15 | 
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 { | 
