Closed dveeden closed 1 year ago
This would be a start:
diff --git a/src/addr_validate.rs b/src/addr_validate.rs
index 9e9a34c..6094d6c 100644
--- a/src/addr_validate.rs
+++ b/src/addr_validate.rs
@@ -41,6 +41,29 @@ fn create_pipe() -> nix::Result<(i32, i32)> {
Ok((read_fd, write_fd))
}
+#[inline]
+#[cfg(target_os = "freebsd")]
+fn create_pipe() -> nix::Result<(i32, i32)> {
+ use nix::fcntl::{fcntl, FcntlArg, FdFlag, OFlag};
+ use nix::unistd::pipe;
+ use std::os::unix::io::RawFd;
+
+ fn set_flags(fd: RawFd) -> nix::Result<()> {
+ let mut flags = FdFlag::from_bits(fcntl(fd, FcntlArg::F_GETFD)?).unwrap();
+ flags |= FdFlag::FD_CLOEXEC;
+ fcntl(fd, FcntlArg::F_SETFD(flags))?;
+ let mut flags = OFlag::from_bits(fcntl(fd, FcntlArg::F_GETFL)?).unwrap();
+ flags |= OFlag::O_NONBLOCK;
+ fcntl(fd, FcntlArg::F_SETFL(flags))?;
+ Ok(())
+ }
+
+ let (read_fd, write_fd) = pipe()?;
+ set_flags(read_fd)?;
+ set_flags(write_fd)?;
+ Ok((read_fd, write_fd))
+}
+
fn open_pipe() -> nix::Result<()> {
MEM_VALIDATE_PIPE.with(|pipes| {
let mut pipes = pipes.borrow_mut();
diff --git a/src/profiler.rs b/src/profiler.rs
index 4bc72ad..52fcb86 100644
--- a/src/profiler.rs
+++ b/src/profiler.rs
@@ -208,6 +208,11 @@ impl ErrnoProtector {
let errno = *libc::__errno_location();
Self(errno)
}
+ #[cfg(target_os = "freebsd")]
+ {
+ let errno = *libc::__error();
+ Self(errno)
+ }
#[cfg(target_os = "macos")]
{
let errno = *libc::__error();
Or even better:
diff --git a/src/addr_validate.rs b/src/addr_validate.rs
index 9e9a34c..7ceafd0 100644
--- a/src/addr_validate.rs
+++ b/src/addr_validate.rs
@@ -19,7 +19,7 @@ fn create_pipe() -> nix::Result<(i32, i32)> {
}
#[inline]
-#[cfg(target_os = "macos")]
+#[cfg(any(target_os = "macos", target_os = "freebsd"))]
fn create_pipe() -> nix::Result<(i32, i32)> {
use nix::fcntl::{fcntl, FcntlArg, FdFlag, OFlag};
use nix::unistd::pipe;
diff --git a/src/profiler.rs b/src/profiler.rs
index 4bc72ad..d89c164 100644
--- a/src/profiler.rs
+++ b/src/profiler.rs
@@ -208,7 +208,7 @@ impl ErrnoProtector {
let errno = *libc::__errno_location();
Self(errno)
}
- #[cfg(target_os = "macos")]
+ #[cfg(any(target_os = "macos", target_os = "freebsd"))]
{
let errno = *libc::__error();
Self(errno)
Good! https://github.com/tikv/pprof-rs/pull/150 is working on separating multiple implementations on different platforms. It would be better to take *bsd into consideration https://doc.rust-lang.org/reference/conditional-compilation.html#target_os .
@YangKeao do you think it still makes sense to do this as part of #150 or should we consider doing something like my suggestion?
Or even better:
diff --git a/src/addr_validate.rs b/src/addr_validate.rs index 9e9a34c..7ceafd0 100644 --- a/src/addr_validate.rs +++ b/src/addr_validate.rs @@ -19,7 +19,7 @@ fn create_pipe() -> nix::Result<(i32, i32)> { } #[inline] -#[cfg(target_os = "macos")] +#[cfg(any(target_os = "macos", target_os = "freebsd"))] fn create_pipe() -> nix::Result<(i32, i32)> { use nix::fcntl::{fcntl, FcntlArg, FdFlag, OFlag}; use nix::unistd::pipe; diff --git a/src/profiler.rs b/src/profiler.rs index 4bc72ad..d89c164 100644 --- a/src/profiler.rs +++ b/src/profiler.rs @@ -208,7 +208,7 @@ impl ErrnoProtector { let errno = *libc::__errno_location(); Self(errno) } - #[cfg(target_os = "macos")] + #[cfg(any(target_os = "macos", target_os = "freebsd"))] { let errno = *libc::__error(); Self(errno)
Thank you. I'll test this patch (and add some other modification, if needed) on freebsd tonight. Let's make pprof-rs
compile on freebsd :beers:.