From 076730d81e1f9f122367ec30129ae4360401b0d2 Mon Sep 17 00:00:00 2001 From: Dan Gohman Date: Sun, 2 Jul 2023 07:33:11 -0700 Subject: [PATCH] Use `weakcall` for `eventfd` on FreeBSD. `eventfd` was introduced in FreeBSD 13, so it isn't in FreeBSD 12. Use `weakcall` to call it on FreeBSD so that we don't have a link-time dependency on it. Fixes #716. --- src/backend/libc/io/syscalls.rs | 17 ++++++++++++++++- 1 file changed, 16 insertions(+), 1 deletion(-) diff --git a/src/backend/libc/io/syscalls.rs b/src/backend/libc/io/syscalls.rs index 34f63b035..44ae4d221 100644 --- a/src/backend/libc/io/syscalls.rs +++ b/src/backend/libc/io/syscalls.rs @@ -282,7 +282,22 @@ pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result #[cfg(any(target_os = "freebsd", target_os = "illumos"))] pub(crate) fn eventfd(initval: u32, flags: EventfdFlags) -> io::Result { - unsafe { ret_owned_fd(c::eventfd(initval, flags.bits())) } + // `eventfd` was added in FreeBSD 13, so it isn't available on FreeBSD 12. + #[cfg(target_os = "freebsd")] + unsafe { + weakcall! { + fn eventfd( + initval: c::c_uint, + flags: c::c_int + ) -> c::c_int + } + ret_owned_fd(eventfd(initval, flags.bits())) + } + + #[cfg(target_os = "illumos")] + unsafe { + ret_owned_fd(c::eventfd(initval, flags.bits())) + } } #[cfg(linux_kernel)]