Skip to content

Commit 8258b7a

Browse files
committed
Extract create_shmem into the shmemfdrs crate
(which adds support for FreeBSD SHM_ANON)
1 parent b3dd16a commit 8258b7a

File tree

3 files changed

+8
-38
lines changed

3 files changed

+8
-38
lines changed

Cargo.toml

+3-3
Original file line numberDiff line numberDiff line change
@@ -8,23 +8,23 @@ repository = "https://github.com/servo/ipc-channel"
88

99
[features]
1010
force-inprocess = []
11-
memfd = ["syscall"]
11+
memfd = ["shmemfdrs/memfd"]
1212
unstable = []
1313
async = ["futures"]
1414

1515
[dependencies]
1616
bincode = "0.9"
1717
lazy_static = "0.2"
18-
libc = "0.2.12"
18+
libc = "0.2.34"
1919
rand = "0.3"
2020
serde = { version="1.0", features=["rc"] }
2121
uuid = {version = "0.5", features = ["v4"]}
2222
fnv = "1.0.3"
2323

2424
[target.'cfg(any(target_os = "linux", target_os = "freebsd"))'.dependencies]
2525
mio = "0.6.1"
26+
shmemfdrs = "0.1"
2627

27-
syscall = { version = "0.2.1", optional = true }
2828
futures = { version = "0.1", optional = true }
2929

3030
[dev-dependencies]

src/lib.rs

+3-4
Original file line numberDiff line numberDiff line change
@@ -26,10 +26,9 @@ extern crate mio;
2626
#[cfg(all(not(feature = "force-inprocess"), any(target_os = "linux",
2727
target_os = "freebsd")))]
2828
extern crate fnv;
29-
#[cfg(all(feature = "memfd", not(feature = "force-inprocess"),
30-
target_os="linux"))]
31-
#[macro_use]
32-
extern crate syscall;
29+
#[cfg(all(not(feature = "force-inprocess"), any(target_os = "linux",
30+
target_os = "freebsd")))]
31+
extern crate shmemfdrs;
3332

3433
#[cfg(feature = "async")]
3534
extern crate futures;

src/platform/unix/mod.rs

+2-31
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ use bincode;
1111
use fnv::FnvHasher;
1212
use libc::{self, MAP_FAILED, MAP_SHARED, PROT_READ, PROT_WRITE, SOCK_SEQPACKET, SOL_SOCKET};
1313
use libc::{SO_LINGER, S_IFMT, S_IFSOCK, c_char, c_int, c_void, getsockopt};
14-
use libc::{iovec, mode_t, msghdr, off_t, recvmsg, sendmsg};
14+
use libc::{iovec, mode_t, msghdr, recvmsg, sendmsg};
1515
use libc::{setsockopt, size_t, sockaddr, sockaddr_un, socketpair, socklen_t, sa_family_t};
1616
use std::cell::Cell;
1717
use std::cmp;
@@ -31,6 +31,7 @@ use std::time::UNIX_EPOCH;
3131
use std::thread;
3232
use mio::unix::EventedFd;
3333
use mio::{Poll, Token, Events, Ready, PollOpt};
34+
use shmemfdrs::create_shmem;
3435

3536
use super::incrementor::Incrementor;
3637

@@ -947,31 +948,6 @@ fn recv(fd: c_int, blocking_mode: BlockingMode)
947948
Ok((main_data_buffer, channels, shared_memory_regions))
948949
}
949950

950-
#[cfg(not(all(target_os="linux", feature="memfd")))]
951-
fn create_shmem(name: CString, length: usize) -> c_int {
952-
unsafe {
953-
// NB: the FreeBSD man page for shm_unlink states that it requires
954-
// write permissions, but testing shows that read-write is required.
955-
let fd = libc::shm_open(name.as_ptr(),
956-
libc::O_CREAT | libc::O_RDWR | libc::O_EXCL,
957-
0o600);
958-
assert!(fd >= 0);
959-
assert!(libc::shm_unlink(name.as_ptr()) == 0);
960-
assert!(libc::ftruncate(fd, length as off_t) == 0);
961-
fd
962-
}
963-
}
964-
965-
#[cfg(all(feature="memfd", target_os="linux"))]
966-
fn create_shmem(name: CString, length: usize) -> c_int {
967-
unsafe {
968-
let fd = memfd_create(name.as_ptr(), 0);
969-
assert!(fd >= 0);
970-
assert!(libc::ftruncate(fd, length as off_t) == 0);
971-
fd
972-
}
973-
}
974-
975951
struct UnixCmsg {
976952
cmsg_buffer: *mut cmsghdr,
977953
msghdr: msghdr,
@@ -1047,11 +1023,6 @@ fn is_socket(fd: c_int) -> bool {
10471023

10481024
// FFI stuff follows:
10491025

1050-
#[cfg(all(feature="memfd", target_os="linux"))]
1051-
unsafe fn memfd_create(name: *const c_char, flags: usize) -> c_int {
1052-
syscall!(MEMFD_CREATE, name, flags) as c_int
1053-
}
1054-
10551026
#[allow(non_snake_case)]
10561027
fn CMSG_LEN(length: size_t) -> size_t {
10571028
CMSG_ALIGN(mem::size_of::<cmsghdr>()) + length

0 commit comments

Comments
 (0)