summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2022-03-06Add MsgFlag::MSG_NOSIGNALi509VCB
2022-02-27Merge #1656bors[bot]
1656: Remove PATH_MAX restriction from with_nix_path and further improve performance r=rtzoeller a=SUPERCILEX This PR removes the `PATH_MAX` limitation since that's wrong anyway: https://insanecoding.blogspot.com/2007/11/pathmax-simply-isnt.html A nice side effect is that this lets us further optimize `with_nix_path` by having the compiler not insert probe frames, saving us another fat pile of instructions: ``` 2,289,930 ( 1.67%) 305,324 ( 0.99%) 152,662 ( 0.74%) 18 ( 0.15%) . . . . . => ???:__rust_probestack (152,662x) ``` New numbers: ``` 19,257,593 (16.43%) 4,415,242 (15.75%) 2,593,635 (12.82%) 41 ( 0.27%) 47 ( 0.12%) 53 ( 0.26%) 7 ( 0.12%) 0 3 ( 0.02%) 2,404,730 (14.52%) 2,721 ( 0.53%) 762,780 (30.96%) 66 ( 0.90%) => /home/asaveau/Desktop/nix/src/lib.rs:<[u8] as nix::NixPath>::with_nix_path (152,556x) ``` ``` Ir Dr Dw I1mr D1mr D1mw ILmr DLmr DLmw Bc Bcm Bi Bim 1,067,892 ( 0.91%) 0 457,668 ( 2.26%) 2 ( 0.01%) 0 0 1 ( 0.02%) . . . . . . fn with_nix_path<T, F>(&self, f: F) -> Result<T> . . . . . . . . . . . . . where . . . . . . . . . . . . . F: FnOnce(&CStr) -> T, . . . . . . . . . . . . . { . . . . . . . . . . . . . // The real PATH_MAX is 4096, but it's statistically unlikely to have a path longer than . . . . . . . . . . . . . // ~300 bytes. See the appendix to get stats for your own machine. . . . . . . . . . . . . . // . . . . . . . . . . . . . // By being smaller than a memory page, we also avoid the compiler inserting a probe frame: . . . . . . . . . . . . . // https://docs.rs/compiler_builtins/latest/compiler_builtins/probestack/index.html . . . . . . . . . . . . . const MAX_STACK_ALLOCATION: usize = 512; . . . . . . . . . . . . . 305,112 ( 0.26%) 0 0 0 0 0 0 0 0 152,556 ( 0.92%) . . . if self.len() >= MAX_STACK_ALLOCATION { . . . . . . . . . . . . . return with_nix_path_allocating(self, f); . . . . . . . . . . . . . } . . . . . . . . . . . . . . . . . . . . . . . . . . let mut buf = MaybeUninit::<[u8; MAX_STACK_ALLOCATION]>::uninit(); . . . . . . . . . . . . . let buf_ptr = buf.as_mut_ptr() as *mut u8; . . . . . . . . . . . . . . . . . . . . . . . . . . unsafe { . . . . . . . . . . . . . ptr::copy_nonoverlapping(self.as_ptr(), buf_ptr, self.len()); . . . . . . . . . . . . . buf_ptr.add(self.len()).write(0); . . . . . . . . . . . . . } . . . . . . . . . . . . . 1,067,892 ( 0.91%) 305,112 ( 1.09%) 152,556 ( 0.75%) 2 ( 0.01%) 7 ( 0.02%) 0 1 ( 0.02%) 0 0 305,112 ( 1.84%) 6 ( 0.00%) 152,556 ( 6.19%) 1 ( 0.01%) match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, self.len() + 1) }) { 8,730,403 ( 7.45%) 1,211,383 ( 4.32%) 1,067,892 ( 5.28%) 18 ( 0.12%) 2 ( 0.00%) 0 2 ( 0.04%) 0 0 1,336,744 ( 8.07%) 609 ( 0.12%) 152,556 ( 6.19%) 62 ( 0.85%) => /rustc/21b4a9cfdcbb1e76f4b36b5c3cfd64d627285093//library/std/src/ffi/c_str.rs:std::ffi::c_str::CStr::from_bytes_with_nul (152,556x) 610,224 ( 0.52%) 610,224 ( 2.18%) . . . . . . . . . . . Ok(s) => Ok(f(s)), . . . . . . . . . . . . . Err(_) => Err(Errno::EINVAL), . . . . . . . . . . . . . } 762,780 ( 0.65%) 610,224 ( 2.18%) . . . . . . . . . . . } . . . . . . . . . . . . . } ``` ## Appendix ```rust use histogram::Histogram; use std::env; use std::fs::{canonicalize, read_dir}; use std::path::Path; fn main() { let args = env::args().collect::<Vec<String>>(); let mut histogram = Histogram::new(); if args.len() == 2 { log(&mut histogram, canonicalize(&args[1]).unwrap()); } else { log(&mut histogram, canonicalize(".").unwrap()); } println!( "min={}\nmax={}\nmean={}\np50={}\np90={}\np99={}\np999={}\nstddev={}\nstdvar={}", histogram.minimum().unwrap(), histogram.maximum().unwrap(), histogram.mean().unwrap(), histogram.percentile(50.0).unwrap(), histogram.percentile(90.0).unwrap(), histogram.percentile(99.0).unwrap(), histogram.percentile(99.9).unwrap(), histogram.stddev().unwrap(), histogram.stdvar().unwrap(), ) } fn log(histogram: &mut Histogram, path: impl AsRef<Path>) { for dir in read_dir(path.as_ref()).unwrap() { let entry = dir.unwrap(); histogram .increment(entry.path().as_os_str().len() as u64) .unwrap(); if entry.file_type().unwrap().is_dir() { log(histogram, entry.path()); } } } ``` Co-authored-by: Alex Saveau <saveau.alexandre@gmail.com>
2022-02-27Remove `PATH_MAX` restriction from `with_nix_path`Alex Saveau
Signed-off-by: Alex Saveau <saveau.alexandre@gmail.com>
2022-02-27Merge #1667bors[bot]
1667: Define _POSIX_VDISABLE on Android to fix doc test r=asomers a=rtzoeller This fixes the compilation [this](https://github.com/rtzoeller/nix/blob/1a2ee3da3026a14d42498f5ca4e4b2c1a75bc81d/src/sys/termios.rs#L27) example documentation on Android. Tested on Termux. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-27Define _POSIX_VDISABLE on Android to fix doc testRyan Zoeller
2022-02-24Merge #1664bors[bot]
1664: also implement Read and Write for &PtyMaster r=rtzoeller a=doy align with std::fs::File which also does this because the underlying calls are just syscalls which are safe to run concurrently Co-authored-by: Jesse Luehrs <doy@tozt.net>
2022-02-22also implement Read and Write for &PtyMasterJesse Luehrs
2022-02-22Merge #1665bors[bot]
1665: Add ENOTRECOVERABLE and EOWNERDEAD error codes on DragonFly r=asomers a=rtzoeller Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-21Add ENOTRECOVERABLE and EOWNERDEAD error codes on DragonFlyRyan Zoeller
2022-02-21Merge #1553bors[bot]
1553: Implement Extend and From/IntoIterator for SigSet r=rtzoeller a=magicant Co-authored-by: WATANABE Yuki <magicant@wonderwand.net>
2022-02-20Implement Extend and From/IntoIterator for SigSetWATANABE Yuki
2022-02-14Merge #1655bors[bot]
1655: 30x performance improvement in `with_nix_path` r=rtzoeller a=SUPERCILEX I've been digging into CPU instructions counts and found that `nix` accounted for an eye-watering 85% of my program's instruction counts (yes, I do a lot of I/O, I know). The fix is simple: don't initialize the stack memory since we're just going to overwrite it anyway. > Note: I also ran rustfmt in a separate commit, not sure if that's ok. ### Before ``` 650,398,225 (85.05%) 5,451,056 (17.31%) 627,714,969 (97.28%) 60 ( 0.54%) 22 ( 0.07%) 3,997 (20.98%) 10 ( 0.18%) 0 752 ( 5.98%) 627,716,244 (97.30%) 267,333 (34.62%) 914,814 (35.11%) 105 ( 0.73%) => /home/asaveau/Desktop/nix/src/lib.rs:<[u8] as nix::NixPath>::with_nix_path (152,469x) ``` ``` 1,677,159 ( 0.22%) 0 762,345 ( 0.12%) 14 ( 0.13%) 0 0 2 ( 0.04%) . . . . . . fn with_nix_path<T, F>(&self, f: F) -> Result<T> 2,287,035 ( 0.30%) 304,938 ( 0.97%) 152,469 ( 0.02%) 5 ( 0.04%) 0 0 0 0 0 304,938 ( 0.05%) . . . => ???:__rust_probestack (152,469x) . . . . . . . . . . . . . where . . . . . . . . . . . . . F: FnOnce(&CStr) -> T, . . . . . . . . . . . . . { 457,407 ( 0.06%) 152,469 ( 0.48%) 152,469 ( 0.02%) 0 0 93 ( 0.49%) 0 0 16 ( 0.13%) 0 0 152,469 ( 5.85%) 97 ( 0.67%) let mut buf = [0u8; PATH_MAX as usize]; 627,104,997 (82.00%) 304,938 ( 0.97%) 624,513,024 (96.78%) 1 ( 0.01%) 0 3,814 (20.02%) 1 ( 0.02%) 0 720 ( 5.72%) 625,122,900 (96.90%) 152,495 (19.75%) . . => ./string/../sysdeps/x86_64/multiarch/memset-vec-unaligned-erms.S:__memset_avx2_unaligned_erms (152,469x) . . . . . . . . . . . . . 304,938 ( 0.04%) 0 0 0 0 0 0 0 0 152,469 ( 0.02%) 2 ( 0.00%) . . if self.len() >= PATH_MAX as usize { . . . . . . . . . . . . . return Err(Errno::ENAMETOOLONG); . . . . . . . . . . . . . } . . . . . . . . . . . . . 1,067,283 ( 0.14%) 152,469 ( 0.48%) 152,469 ( 0.02%) 1 ( 0.01%) 4 ( 0.01%) 0 1 ( 0.02%) 0 0 0 0 152,469 ( 5.85%) 1 ( 0.01%) buf[..self.len()].copy_from_slice(self); 3,202,541 ( 0.42%) 914,814 ( 2.91%) 609,876 ( 0.09%) 1 ( 0.01%) 2 ( 0.01%) 0 0 0 0 458,005 ( 0.07%) 114,562 (14.84%) 152,469 ( 5.85%) . => /rustc/21b4a9cfdcbb1e76f4b36b5c3cfd64d627285093/library/core/src/slice/mod.rs:core::slice::<impl [T]>::copy_from_slice (152,469x) 762,345 ( 0.10%) 304,938 ( 0.97%) 152,469 ( 0.02%) 0 6 ( 0.02%) 0 0 0 0 152,469 ( 0.02%) 6 ( 0.00%) 152,469 ( 5.85%) 1 ( 0.01%) match CStr::from_bytes_with_nul(&buf[..=self.len()]) { 8,350,190 ( 1.09%) 1,181,828 ( 3.75%) 1,067,283 ( 0.17%) 19 ( 0.17%) 2 ( 0.01%) 87 ( 0.46%) 3 ( 0.05%) 0 16 ( 0.13%) 1,220,525 ( 0.19%) 167 ( 0.02%) 152,469 ( 5.85%) 5 ( 0.03%) => /rustc/21b4a9cfdcbb1e76f4b36b5c3cfd64d627285093//library/std/src/ffi/c_str.rs:std::ffi::c_str::CStr::from_bytes_with_nul (152,469x) 609,876 ( 0.08%) 609,876 ( 1.94%) 0 0 1 ( 0.00%) . . . . . . . . Ok(s) => Ok(f(s)), . . . . . . . . . . . . . Err(_) => Err(Errno::EINVAL), . . . . . . . . . . . . . } 914,814 ( 0.12%) 762,345 ( 2.42%) . . . . . . . . . . . } . . . . . . . . . . . . . } ``` ### After ``` 21,462,416 (15.81%) 4,688,455 (15.27%) 2,896,847 (14.17%) 74 ( 0.64%) 11 ( 0.04%) 249 ( 1.58%) 8 ( 0.15%) 0 48 ( 0.38%) 2,593,200 (12.98%) 1,128 ( 0.22%) 762,305 (31.08%) 158 ( 1.32%) => /home/asaveau/Desktop/nix/src/lib.rs:<[u8] as nix::NixPath>::with_nix_path (152,461x) ``` ``` 1,067,227 ( 0.79%) 0 609,844 ( 2.98%) 1 ( 0.01%) 0 0 1 ( 0.02%) . . . . . . fn with_nix_path<T, F>(&self, f: F) -> Result<T> 2,286,915 ( 1.68%) 304,922 ( 0.99%) 152,461 ( 0.75%) 19 ( 0.16%) 0 0 0 0 0 304,922 ( 1.53%) . . . => ???:__rust_probestack (152,461x) . . . . . . . . . . . . . where . . . . . . . . . . . . . F: FnOnce(&CStr) -> T, . . . . . . . . . . . . . { 304,922 ( 0.22%) 0 0 0 0 0 0 0 0 152,461 ( 0.76%) 6 ( 0.00%) . . if self.len() >= PATH_MAX as usize { . . . . . . . . . . . . . return Err(Errno::ENAMETOOLONG); . . . . . . . . . . . . . } . . . . . . . . . . . . . . . . . . . . . . . . . . let mut buf = MaybeUninit::<[u8; PATH_MAX as usize]>::uninit(); . . . . . . . . . . . . . let buf_ptr = buf.as_mut_ptr() as *mut u8; . . . . . . . . . . . . . . . . . . . . . . . . . . unsafe { . . . . . . . . . . . . . ptr::copy_nonoverlapping(self.as_ptr(), buf_ptr, self.len()); . . . . . . . . . . . . . buf_ptr.add(self.len()).write(0); . . . . . . . . . . . . . } . . . . . . . . . . . . . 1,067,227 ( 0.79%) 304,922 ( 0.99%) 152,461 ( 0.75%) 1 ( 0.01%) 3 ( 0.01%) 0 1 ( 0.02%) 0 0 304,922 ( 1.53%) 4 ( 0.00%) 152,461 ( 6.22%) 1 ( 0.01%) match CStr::from_bytes_with_nul(unsafe { slice::from_raw_parts(buf_ptr, self.len() + 1) }) { 8,349,726 ( 6.15%) 1,181,764 ( 3.85%) 1,067,227 ( 5.22%) 18 ( 0.15%) 1 ( 0.00%) 83 ( 0.53%) 2 ( 0.04%) 0 16 ( 0.13%) 1,220,453 ( 6.11%) 158 ( 0.03%) 152,461 ( 6.22%) 4 ( 0.03%) => /rustc/21b4a9cfdcbb1e76f4b36b5c3cfd64d627285093//library/std/src/ffi/c_str.rs:std::ffi::c_str::CStr::from_bytes_with_nul (152,461x) 609,844 ( 0.45%) 609,844 ( 1.99%) . . . . . . . . . . . Ok(s) => Ok(f(s)), . . . . . . . . . . . . . Err(_) => Err(Errno::EINVAL), . . . . . . . . . . . . . } 762,305 ( 0.56%) 609,844 ( 1.99%) 0 1 ( 0.01%) 0 0 1 ( 0.02%) . . . . . . } . . . . . . . . . . . . . } ``` Co-authored-by: Alex Saveau <saveau.alexandre@gmail.com>
2022-02-1330X performance improvement in with_nix_path by not initializing memoryAlex Saveau
Signed-off-by: Alex Saveau <saveau.alexandre@gmail.com>
2022-02-13Merge #1662bors[bot]
1662: Enable uconxtext module for s390x r=asomers a=rtzoeller Added to libc by https://github.com/rust-lang/libc/commit/38569c719befeb5b5051caeb6b0ff628ccd0ff90 Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-13Enable uconxtext module for s390xRyan Zoeller
Added to libc by https://github.com/rust-lang/libc/commit/38569c719befeb5b5051caeb6b0ff628ccd0ff90
2022-02-07Merge #1557bors[bot]
1557: expose process_vm_readv, process_vm_writev for android r=rtzoeller a=rupansh see https://github.com/rust-lang/libc/pull/1878 Co-authored-by: rupansh-arch <rupanshsekar@hotmail.com>
2022-02-07enable process_vm_readv, process_vm_writev for androidrupansh-arch
CHANGELOG: add process_vm_* entry process_vm_*: fix documentation for android expose process_vm_readv, process_vm_writev for android Signed-off-by: rupansh-arch <rupanshsekar@hotmail.com>
2022-02-07Merge #1563bors[bot]
1563: Impl `AsRawFd` for `OwningIter` r=rtzoeller a=deantvv For issue #1558 Co-authored-by: Dean Li <deantvv@gmail.com>
2022-02-07update changelogDean Li
2022-02-07Impl `AsRawFd` for `OwningIter`Dean Li
For issue #1558
2022-02-07Merge #1658bors[bot]
1658: use version of libc published on crates r=rtzoeller a=pacak https://github.com/rust-lang/libc/pull/2543 was merged and is available starting from 0.2.114. Using published version of libc makes it easier to use git version of nix Co-authored-by: Michael Baikov <manpacket@gmail.com>
2022-02-07use version of libc published on cratesMichael Baikov
https://github.com/rust-lang/libc/pull/2543 was merged and is available starting from 0.2.114. Using published version of libc makes it easier to use git version of nix
2022-02-06Merge #1652bors[bot]
1652: Add support for aarch64-apple-darwin r=asomers a=rtzoeller Supersedes #1396, resolves #1646. Also replace 'OSX' language with 'macOS', to match Rust's language. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-06Merge #1653bors[bot]
1653: Document inotify, mman, personality, reboot, timerfd r=asomers a=rtzoeller Document the `inotify`, `mman`, `personality`, `reboot`, and `timerfd` modules. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-06Merge #1654bors[bot]
1654: Add accept4 on DragonFly, Emscripten, Fuchsia, Illumos, and NetBSD. r=rtzoeller a=rtzoeller Expand accept4 support to more platforms. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-02-04Add accept4 on supported platformsRyan Zoeller
2022-02-02Document timerfd.rsRyan Zoeller
2022-02-02Document reboot.rsRyan Zoeller
2022-02-02Document personality.rsRyan Zoeller
2022-02-02Document mman.rsRyan Zoeller
No documentation provided for MADV_CAN_REUSE, as Darwin doesn't actually document its functionality.
2022-01-31Document inotify.rsRyan Zoeller
2022-01-29Add support for aarch64-apple-darwinRyan Zoeller
Replace 'OSX' language with 'macOS', to match Rust's language.
2022-01-30Merge #1651bors[bot]
1651: Fix typo in pread docs r=rtzoeller a=rtzoeller Fixes #1648. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-01-29Fix typo in pread docsRyan Zoeller
2022-01-25Merge #1603bors[bot]
1603: uclibc support r=rtzoeller a=skrap uclibc is a libc alternative (peer to glibc and musl) which is used in low-resource embedded linux applications. It's supported in rust as the `target_env` of several tier 3 targets, but `nix` currently doesn't build. This patch provides a few customizations to get uclibc building. To test: * Get nightly rust * Follow directions for getting a cross toolchain and env setup here: https://github.com/rust-lang/rust/blob/master/src/doc/rustc/src/platform-support/armv7-unknown-linux-uclibceabihf.md Thanks for your consideration! Co-authored-by: Jonah Petri <jonah@petri.us>
2022-01-24uclibc supportJonah Petri
2022-01-23Merge #1642bors[bot]
1642: InetAddr::from_std should set sin_len/sin6_len on the BSDs r=asomers a=rtzoeller Resolves #1246. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-01-23Merge #1644bors[bot]
1644: Make memoffset dependency optional r=asomers a=rtzoeller Only the socket feature depends on memoffset. Allow clients to skip pulling memoffset in as a dependency if they don't need it. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-01-23Make memoffset dependency optionalRyan Zoeller
Only the socket feature depends on memoffset. Allow clients to skip pulling memoffset in as a dependency if they don't need it.
2022-01-23InetAddr::from_std should set sin_len/sin6_len on the BSDsRyan Zoeller
2022-01-23Merge #1640bors[bot]
1640: Add fspacectl on FreeBSD r=rtzoeller a=asomers Co-authored-by: Alan Somers <asomers@gmail.com>
2022-01-23Disable the fspacectl testsAlan Somers
They fail to link prior to FreeBSD 14.0, which we don't use in CI. So mark them as no_run. The only alternative I see would be to add a build script.
2022-01-23Add fspacectl on FreeBSDAlan Somers
2022-01-23Merge #1639bors[bot]
1639: Fix Clippy warnings on FreeBSD with the latest nightly r=rtzoeller a=asomers * Better type safety for mqueue * Suppress clippy::not_unsafe_ptr_arg_deref warnings in ptrace on BSD Co-authored-by: Alan Somers <asomers@gmail.com>
2022-01-22Suppress clippy::not_unsafe_ptr_arg_deref warnings in ptrace on BSDAlan Somers
Technically these functions don't violate Rust's safety rules, because libc::ptrace doesn't dereference those pointer args. Instead, it passes them directly to the kernel.
2022-01-22Better type safety for mqueueAlan Somers
On some platforms, mqd_t is a pointer. That means code like the below can trigger a segfault. Fix it by defining a Newtype around mqd_t that prevents use-after-free and dangling pointer scenarios. ```rust fn invalid_mqd_t() { let mqd: libc::mqd_t = std::ptr::null_mut(); mq_close(mqd).unwrap(); } ``` Also, get test coverage for mqueue in CI on FreeBSD.
2022-01-19Merge #1636bors[bot]
1636: Add MAP_FIXED_NOREPLACE on Linux r=rtzoeller a=rtzoeller Resolves #1393. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-01-18Merge #1634bors[bot]
1634: Define UMOUNT_NOFOLLOW, FUSE_SUPER_MAGIC r=rtzoeller a=rtzoeller Resolves #1631 and resolves #1633. Co-authored-by: Ryan Zoeller <rtzoeller@rtzoeller.com>
2022-01-18Define UMOUNT_NOFOLLOW, FUSE_SUPER_MAGIC on LinuxRyan Zoeller
Requested-by: jiangliu
2022-01-18Add MAP_FIXED_NOREPLACE on LinuxRyan Zoeller