about summary refs log tree commit diff
path: root/library/std/src/sys
AgeCommit message (Collapse)AuthorLines
2020-10-10Split net.rs into multiple filesLinkTed-2635/+3297
2020-10-10unix: Extend UnixStream and UnixDatagram to send and receive file descriptorsLinkTed-0/+1111
Add the functions `recv_vectored_fds` and `send_vectored_fds` to send and receive file descriptors, by using `recvmsg` and `sendmsg` system call.
2020-10-10Auto merge of #77717 - tmiasko:posix-spawn-error-check, r=cuviperbors-18/+24
Fix error checking in posix_spawn implementation of Command * Check for errors returned from posix_spawn*_init functions * Check for non-zero return value from posix_spawn functions
2020-10-09simplify the cfg in ReadDir constructionJosh Stone-8/+6
Co-authored-by: David Tolnay <dtolnay@gmail.com>
2020-10-09remove ReadDir.end_of_stream on targets that don't use itJosh Stone-1/+18
2020-10-09unix/vxworks: make DirEntry slightly smallerJosh Stone-10/+8
`DirEntry` contains a `ReadDir` handle, which used to just be a wrapper on `Arc<InnerReadDir>`. Commit af75314ecdbc5 added `end_of_stream: bool` which is not needed by `DirEntry`, but adds 8 bytes after padding. We can let `DirEntry` have an `Arc<InnerReadDir>` directly to avoid that.
2020-10-09Remove some dead code in windows-gnu stdMateusz Mikuła-64/+0
2020-10-08Implement the same optimization in windows/timeThom Chiovoloni-19/+17
2020-10-08Switch to using a single atomic and treating 0 as 'uninitialized'Thom Chiovoloni-16/+12
2020-10-09Assert state in sys/unsupported's RwLock::write_unlock.Mara Bos-1/+1
Co-authored-by: Joshua Nelson <joshua@yottadb.com>
2020-10-08Fiddle with the commentsThom Chiovoloni-5/+5
2020-10-08Check for errors returned from posix_spawn*_init functionsTomasz Miąsko-8/+10
The posix_spawnattr_init & posix_spawn_file_actions_init might fail, but their return code is not checked. Check for non-zero return code and destroy only succesfully initialized objects.
2020-10-08Check for non-zero return value from posix_spawn functionsTomasz Miąsko-10/+14
The cvt function compares the argument with -1 and when equal returns a new io::Error constructed from errno. It is used together posix_spawn_* functions. This is incorrect. Those functions do not set errno. Instead they return non-zero error code directly. Check for non-zero return code and use it to construct a new io::Error.
2020-10-08Apply deny(unsafe_op_in_unsafe_fn) to all of sys/unsupported.Mara Bos-9/+10
2020-10-08Implement `AsRawFd` for `StdinLock` etc. on WASI.Dan Gohman-0/+18
WASI implements `AsRawFd` for `Stdin`, `Stdout`, and `Stderr`, so implement it for `StdinLock`, `StdoutLock`, and `StderrLock` as well.
2020-10-08Avoid SeqCst or static mut in mach_timebase_info cacheThom Chiovoloni-22/+36
2020-10-08Remove unsafety from unsupported/rwlosck.rs by using a Cell.Mara Bos-18/+16
Replacing the UnsafeCell by a Cell makes it all safe.
2020-10-08Remove unsafety from unsupported/mutex.rs by using a Cell.Mara Bos-14/+8
Replacing the UnsafeCell by a Cell simplifies things and makes it all safe.
2020-10-08Remove unnecessary rustc_const_stable attributes.Mara Bos-1/+0
2020-10-08Auto merge of #77346 - Caduser2020:master, r=Mark-Simulacrumbors-119/+170
`#[deny(unsafe_op_in_unsafe_fn)]` in sys/sgx This is part of #73904. Enclose unsafe operations in unsafe blocks in `libstd/sys/sgx`.
2020-10-08`#[deny(unsafe_op_in_unsafe_fn)]` in sys/sgxCaduser2020-119/+170
Run `./x.py` fmt Add reference link Fix reference link Apply review suggestions.
2020-10-08Remove #![allow(unsafe_op_in_unsafe_fn)] except for mod.rsmaekawatoshiki-15/+0
2020-10-07Formatting.Mara Bos-1/+5
2020-10-07Get rid of raw pointers and UnsafeCell in cloudabi condvar.Mara Bos-25/+16
2020-10-07Get rid of UnsafeCell in cloudabi rwlock.Mara Bos-24/+21
2020-10-07Get rid of UnsafeCell<MaybeUninit>s in cloudabi mutex.Mara Bos-28/+24
2020-10-07Use slice_as_mut_ptr instead of first_ptr_mut.Mara Bos-1/+1
This function was renamed.
2020-10-06Use futex-based thread-parker for Wasm32.Mara Bos-0/+19
2020-10-06Formatting.Mara Bos-1/+2
2020-10-06Add comment documenting NtWaitForKeyedEvent's timeout interpretation.Mara Bos-2/+4
2020-10-06Add documentation to Windows thread parker implementation.Mara Bos-1/+60
2020-10-06Fix typos in comments.Mara Bos-2/+2
2020-10-06Improve windows thread parker.Mara Bos-24/+34
- Clarify memory ordering and spurious wakeups.
2020-10-06Add fast futex-based thread parker for Windows.Mara Bos-0/+179
2020-10-06Add Keyed Events API to sys::windows::c.Mara Bos-0/+32
2020-10-06Add WaitOnAddress/WakeByAddress API to sys::windows::c.Mara Bos-0/+16
2020-10-04Update libc to 0.2.79Josh Triplett-23/+3
This also fixes issues with inconsistent `unsafe` on functions.
2020-10-04Auto merge of #77380 - fusion-engineering-forks:unbox-the-mutex, r=dtolnaybors-0/+33
Unbox mutexes and condvars on some platforms Both mutexes and condition variables contained a Box containing the actual os-specific object. This was done because moving these objects may cause undefined behaviour on some platforms. However, this is not needed on Windows[1], Wasm[2], cloudabi[2], and 'unsupported'[3], were the box was only needlessly making them less efficient. This change gets rid of the box on those platforms. On those platforms, `Condvar` can no longer verify it is only used with one `Mutex`, as mutexes no longer have a stable address. This was addressed and considered acceptable in #76932. [1]\: https://docs.microsoft.com/en-us/windows/win32/api/synchapi/nf-synchapi-initializesrwlock [2]\: These are just a single atomic integer together with futex wait/wake calls/instructions. [3]\: The `unsupported` platform doesn't support multiple threads at all.
2020-10-03Rollup merge of #77182 - GuillaumeGomez:missing-examples-fd-traits, r=pickfireJonas Schievink-0/+40
Add missing examples for Fd traits Not sure what happened here... This is a reopening of #77142 r? @Dylan-DPC
2020-10-02Rollup merge of #77432 - tmiasko:posix-spawn-musl, r=cuviperJonas Schievink-6/+8
Use posix_spawn on musl targets The posix_spawn had been available in a form suitable for use in a Command implementation since musl 0.9.12. Use it in a preference to a fork when possible, to benefit from CLONE_VM|CLONE_VFORK used there.
2020-10-02Use posix_spawn() on unix if program is a pathAlexander Mols-1/+7
Previously `Command::spawn` would fall back to the non-posix_spawn based implementation if the `PATH` environment variable was possibly changed. On systems with a modern (g)libc `posix_spawn()` can be significantly faster. If program is a path itself the `PATH` environment variable is not used for the lookup and it should be safe to use the `posix_spawnp()` method. [1] We found this, because we have a cli application that effectively runs a lot of subprocesses. It would sometimes noticeably hang while printing output. Profiling showed that the process was spending the majority of time in the kernel's `copy_page_range` function while spawning subprocesses. During this time the process is completely blocked from running, explaining why users were reporting the cli app hanging. Through this we discovered that `std::process::Command` has a fast and slow path for process execution. The fast path is backed by `posix_spawnp()` and the slow path by fork/exec syscalls being called explicitly. Using fork for process creation is supposed to be fast, but it slows down as your process uses more memory. It's not because the kernel copies the actual memory from the parent, but it does need to copy the references to it (see `copy_page_range` above!). We ended up using the slow path, because the command spawn implementation in falls back to the slow path if it suspects the PATH environment variable was changed. Here is a smallish program demonstrating the slowdown before this code change: ``` use std::process::Command; use std::time::Instant; fn main() { let mut args = std::env::args().skip(1); if let Some(size) = args.next() { // Allocate some memory let _xs: Vec<_> = std::iter::repeat(0) .take(size.parse().expect("valid number")) .collect(); let mut command = Command::new("/bin/sh"); command .arg("-c") .arg("echo hello"); if args.next().is_some() { println!("Overriding PATH"); command.env("PATH", std::env::var("PATH").expect("PATH env var")); } let now = Instant::now(); let child = command .spawn() .expect("failed to execute process"); println!("Spawn took: {:?}", now.elapsed()); let output = child.wait_with_output().expect("failed to wait on process"); println!("Output: {:?}", output); } else { eprintln!("Usage: prog [size]"); std::process::exit(1); } () } ``` Running it and passing different amounts of elements to use to allocate memory shows that the time taken for `spawn()` can differ quite significantly. In latter case the `posix_spawnp()` implementation is 30x faster: ``` $ cargo run --release 10000000 ... Spawn took: 324.275µs hello $ cargo run --release 10000000 changepath ... Overriding PATH Spawn took: 2.346809ms hello $ cargo run --release 100000000 ... Spawn took: 387.842µs hello $ cargo run --release 100000000 changepath ... Overriding PATH Spawn took: 13.434677ms hello ``` [1]: https://github.com/bminor/glibc/blob/5f72f9800b250410cad3abfeeb09469ef12b2438/posix/execvpe.c#L81
2020-10-02Simplify fd examplesGuillaume Gomez-19/+16
2020-10-02Auto merge of #77029 - ehuss:command-access, r=dtolnaybors-8/+141
Add accessors to Command. This adds some accessor methods to `Command` to provide a way to access the values set when building the `Command`. An example where this can be useful is to display the command to be executed. This is roughly based on the [`ProcessBuilder`](https://github.com/rust-lang/cargo/blob/13b73cdaf76b2d9182515c9cf26a8f68342d08ef/src/cargo/util/process_builder.rs#L105-L134) in Cargo. Possible concerns about the API: - Values with NULs on Unix will be returned as `"<string-with-nul>"`. I don't think it is practical to avoid this, since otherwise a whole separate copy of all the values would need to be kept in `Command`. - Does not handle `arg0` on Unix. This can be awkward to support in `get_args` and is rarely used. I figure if someone really wants it, it can be added to `CommandExt` as a separate method. - Does not offer a way to detect `env_clear`. I'm uncertain if it would be useful for anyone. - Does not offer a way to get an environment variable by name (`get_env`). I figure this can be added later if anyone really wants it. I think the motivation for this is weak, though. Also, the API could be a little awkward (return a `Option<Option<&OsStr>>`?). - `get_envs` could skip "cleared" entries and just return `&OsStr` values instead of `Option<&OsStr>`. I'm on the fence here. My use case is to display a shell command, and I only intend it to be roughly equivalent to the actual execution, and I probably won't display `None` entries. I erred on the side of providing extra information, but I suspect many situations will just filter out the `None`s. - Could implement more iterator stuff (like `DoubleEndedIterator`). I have not implemented new std items before, so I'm uncertain if the existing issue should be reused, or if a new tracking issue is needed. cc #44434
2020-10-02No longer put windows condvars in a box.Mara Bos-1/+1
Windows condition variables are movable (while not borrowed) according to their documentation.
2020-10-02No longer put wasm condvars in a box.Mara Bos-1/+1
These condvars are just an AtomicUsize, so can be moved without problems.
2020-10-02No longer put condvars on the 'unsupported' platform in a box.Mara Bos-1/+1
These condvars are unsupported and implemented as a ZST, so can be moved without problems.
2020-10-02No longer put cloudabi condvars in a box.Mara Bos-1/+1
Cloudabi condvars may be moved safely.
2020-10-02Make it possible to have unboxed condvars on specific platforms.Mara Bos-0/+16
This commit keeps all condvars boxed on all platforms, but makes it trivial to remove the box on some platforms later.
2020-10-02No longer put windows mutexes in a box.Mara Bos-1/+4
Windows SRW locks are movable (while not borrowed) according to their documentation.
2020-10-02No longer put wasm mutexes in a box.Mara Bos-1/+1
These mutexes are just an AtomicUsize, so can be moved without problems.