From f40f3068a0e5de31f663438a950e0fa5f5ef2e8d Mon Sep 17 00:00:00 2001 From: Alan Somers Date: Sun, 3 Jan 2021 10:40:41 -0700 Subject: [PATCH] aio functions do not require librt on FreeBSD On FreeBSD, the aio_ functions require librt _only_ if they use SIGEV_THREAD completion notification. However, due to Rust's originally poor support for C unions, libc doesn't even expose some of the fields of struct sigevent that SIGEV_THREAD requires. Accordingly, there is no need to link librt to programs using aio via libc. This change partially reverts 8c23f77704d4749f5f137c92a048e22fea9d385e from PR #1630 . While I'm here, fix the linkage of lio_listio on DragonflyBSD. It _does_ require librt. --- src/unix/bsd/freebsdlike/dragonfly/mod.rs | 21 +++++++++++++++++++++ src/unix/bsd/freebsdlike/freebsd/mod.rs | 19 +++++++++++++++++++ src/unix/bsd/freebsdlike/mod.rs | 17 ----------------- 3 files changed, 40 insertions(+), 17 deletions(-) diff --git a/src/unix/bsd/freebsdlike/dragonfly/mod.rs b/src/unix/bsd/freebsdlike/dragonfly/mod.rs index 0548a3bf4a3f2..641fb89235570 100644 --- a/src/unix/bsd/freebsdlike/dragonfly/mod.rs +++ b/src/unix/bsd/freebsdlike/dragonfly/mod.rs @@ -1081,6 +1081,27 @@ extern "C" { ) -> *mut ::c_void; } +#[link(name = "rt")] +extern "C" { + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; +} + cfg_if! { if #[cfg(libc_thread_local)] { mod errno; diff --git a/src/unix/bsd/freebsdlike/freebsd/mod.rs b/src/unix/bsd/freebsdlike/freebsd/mod.rs index 6a7cc49a500e9..edb2b29ab9f56 100644 --- a/src/unix/bsd/freebsdlike/freebsd/mod.rs +++ b/src/unix/bsd/freebsdlike/freebsd/mod.rs @@ -1210,6 +1210,18 @@ safe_f! { extern "C" { pub fn __error() -> *mut ::c_int; + pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; + pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; + pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; + pub fn aio_suspend( + aiocb_list: *const *const aiocb, + nitems: ::c_int, + timeout: *const ::timespec, + ) -> ::c_int; + pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; + pub fn extattr_delete_fd( fd: ::c_int, attrnamespace: ::c_int, @@ -1300,6 +1312,13 @@ extern "C" { flags: ::c_int, ) -> ::c_int; + pub fn lio_listio( + mode: ::c_int, + aiocb_list: *const *mut aiocb, + nitems: ::c_int, + sevp: *mut sigevent, + ) -> ::c_int; + pub fn posix_fallocate( fd: ::c_int, offset: ::off_t, diff --git a/src/unix/bsd/freebsdlike/mod.rs b/src/unix/bsd/freebsdlike/mod.rs index a51511b466469..d126391f31e7a 100644 --- a/src/unix/bsd/freebsdlike/mod.rs +++ b/src/unix/bsd/freebsdlike/mod.rs @@ -1393,12 +1393,6 @@ extern "C" { timeout: *const ::timespec, ) -> ::c_int; pub fn lchflags(path: *const ::c_char, flags: ::c_ulong) -> ::c_int; - pub fn lio_listio( - mode: ::c_int, - aiocb_list: *const *mut aiocb, - nitems: ::c_int, - sevp: *mut sigevent, - ) -> ::c_int; pub fn lutimes(file: *const ::c_char, times: *const ::timeval) -> ::c_int; pub fn memrchr( cx: *const ::c_void, @@ -1603,17 +1597,6 @@ extern "C" { #[link(name = "rt")] extern "C" { - pub fn aio_read(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_write(aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_fsync(op: ::c_int, aiocbp: *mut aiocb) -> ::c_int; - pub fn aio_error(aiocbp: *const aiocb) -> ::c_int; - pub fn aio_return(aiocbp: *mut aiocb) -> ::ssize_t; - pub fn aio_suspend( - aiocb_list: *const *const aiocb, - nitems: ::c_int, - timeout: *const ::timespec, - ) -> ::c_int; - pub fn aio_cancel(fd: ::c_int, aiocbp: *mut aiocb) -> ::c_int; pub fn mq_close(mqd: ::mqd_t) -> ::c_int; pub fn mq_getattr(mqd: ::mqd_t, attr: *mut ::mq_attr) -> ::c_int; pub fn mq_notify(mqd: ::mqd_t, notification: *const ::sigevent)