From f37cc7f01e4948e4c43aaa8bb11f792a58d7bf11 Mon Sep 17 00:00:00 2001 From: link2xt Date: Sat, 2 Jul 2022 23:11:10 +0000 Subject: [PATCH] Use epoll_create() as a fallback for epoll_create1() --- src/sys/unix/selector/epoll.rs | 28 +++++++++++++++++++++------- 1 file changed, 21 insertions(+), 7 deletions(-) diff --git a/src/sys/unix/selector/epoll.rs b/src/sys/unix/selector/epoll.rs index 7853ed654..80df913e5 100644 --- a/src/sys/unix/selector/epoll.rs +++ b/src/sys/unix/selector/epoll.rs @@ -31,13 +31,27 @@ impl Selector { #[cfg(not(target_os = "android"))] let flag = libc::EPOLL_CLOEXEC; - syscall!(epoll_create1(flag)).map(|ep| Selector { - #[cfg(debug_assertions)] - id: NEXT_ID.fetch_add(1, Ordering::Relaxed), - ep, - #[cfg(debug_assertions)] - has_waker: AtomicBool::new(false), - }) + syscall!(syscall(libc::SYS_epoll_create1, flag)) + .map(|fd| fd as libc::c_int) + .or_else(|e| { + match e.raw_os_error() { + Some(libc::ENOSYS) => { + // Using epoll_create() followed by fcntl() instead of epoll_create1() with EPOLL_CLOEXEC + // flag for backwards compatibility. + let ep = syscall!(epoll_create(1024))?; + + syscall!(fcntl(ep, libc::F_SETFD, libc::FD_CLOEXEC)).map(|_| ep) + } + _ => Err(e), + } + }) + .map(|ep| Selector { + #[cfg(debug_assertions)] + id: NEXT_ID.fetch_add(1, Ordering::Relaxed), + ep, + #[cfg(debug_assertions)] + has_waker: AtomicBool::new(false), + }) } pub fn try_clone(&self) -> io::Result {