Commit Graph

325 Commits

Author SHA1 Message Date
LinkTed
ce167f8be7 Fix type mismatching for different OSes. 2020-10-10 15:19:13 +02:00
LinkTed
889c9272cb Remove SocketCred for emscripten 2020-10-10 15:19:13 +02:00
LinkTed
0fcb834832 Fix unused import for IoSliceMut for macos 2020-10-10 15:19:13 +02:00
LinkTed
31e6e3896d Fix SO_PASSCRED for macos 2020-10-10 15:19:13 +02:00
LinkTed
b01ce2cfd0 Fix MSG_CMSG_CLOEXEC for macos 2020-10-10 15:19:13 +02:00
LinkTed
c2a1b50140 Add conditional compilation for import 2020-10-10 15:19:13 +02:00
LinkTed
e0cedba63e Fix cfg condition for test 2020-10-10 15:19:13 +02:00
LinkTed
d30508f95c Remove target_os, which does not have SO_PASSCRED constant in libc 2020-10-10 15:19:13 +02:00
LinkTed
1f6d7dcc0a Remove target_os, which does not have cmsghdr struct in libc 2020-10-10 15:19:13 +02:00
LinkTed
7b476d87fb Remove target_os, which does not have MSG_CMSG_CLOEXEC constant in libc 2020-10-10 15:19:12 +02:00
LinkTed
db902bca3a Add the code of the tracking issue 2020-10-10 15:19:12 +02:00
LinkTed
cc085e9170 Replace assert with unreachable 2020-10-10 15:19:12 +02:00
LinkTed
e61148f98a Cast boolean into int directly in function set_passcred 2020-10-10 15:19:12 +02:00
LinkTed
d0b133cdc6 Remove unsupported target_os for SocketCred 2020-10-10 15:19:12 +02:00
LinkTed
5964d599ac Change standard types to libc types 2020-10-10 15:19:12 +02:00
LinkTed
1902711f38 Change name of struct to SocketCred 2020-10-10 15:19:12 +02:00
LinkTed
eeea5c23b4 Change API to unsafe and add doc comments 2020-10-10 15:19:12 +02:00
LinkTed
686964f0f5 Add set_passcred and passcred methods to UnixStream and UnixDatagram 2020-10-10 15:19:12 +02:00
LinkTed
19c5fdda7c Rename test.rs to tests.rs 2020-10-10 15:19:12 +02:00
LinkTed
a91fd7328c Add doc comments 2020-10-10 15:19:12 +02:00
LinkTed
46764d48bb Add doc(cfg(...)) 2020-10-10 15:19:12 +02:00
LinkTed
1869141e54 Reduce impl trait by using macro in raw_fd.rs 2020-10-10 15:19:12 +02:00
LinkTed
53791b3ff4 Move conditional compilation to the upper module and sort the target OS list alphabetically 2020-10-10 15:19:12 +02:00
LinkTed
07ed6afc6d Remove unnecessary path 2020-10-10 15:19:12 +02:00
LinkTed
6ed9bface6 Use fill instead of memset 2020-10-10 15:19:12 +02:00
LinkTed
1f3195a5df Remove inner function in bind, connect and send_to 2020-10-10 15:19:12 +02:00
LinkTed
4c929a00ee Remove lifetime annotation in messages function 2020-10-10 15:19:12 +02:00
LinkTed
b82f29d780 Remove Clone trait bound in add_to_ancillary_data 2020-10-10 15:19:11 +02:00
LinkTed
3dfab6fb64 Add integer overflow check 2020-10-10 15:19:11 +02:00
LinkTed
e1084052a7 Replace TryFrom of AncillaryData with a private method. 2020-10-10 15:19:11 +02:00
LinkTed
8784ffbb4e Using read_unaligned instead of memcpy. 2020-10-10 15:19:11 +02:00
LinkTed
8783b06bd2 Move add_to_ancillary_data and AncillaryDataIter to ancillary.rs 2020-10-10 15:19:11 +02:00
LinkTed
e6984eee6f Add UCred struct 2020-10-10 15:19:11 +02:00
LinkTed
6f82ddf18e Add AncillaryError 2020-10-10 15:19:11 +02:00
LinkTed
6fa7c3f79e Split net.rs into multiple files 2020-10-10 15:19:11 +02:00
LinkTed
0b3c9d8465 unix: Extend UnixStream and UnixDatagram to send and receive file descriptors
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-10 15:19:11 +02:00
bors
7477d445c8 Auto merge of #77717 - tmiasko:posix-spawn-error-check, r=cuviper
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-10 10:59:20 +00:00
Josh Stone
1d06b07765 simplify the cfg in ReadDir construction
Co-authored-by: David Tolnay <dtolnay@gmail.com>
2020-10-09 10:54:50 -07:00
Josh Stone
365e00aeee remove ReadDir.end_of_stream on targets that don't use it 2020-10-09 10:00:11 -07:00
Josh Stone
c1297eca3e unix/vxworks: make DirEntry slightly smaller
`DirEntry` contains a `ReadDir` handle, which used to just be a wrapper
on `Arc<InnerReadDir>`. Commit af75314ecd 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-09 10:00:11 -07:00
Thom Chiovoloni
59c06e9e40 Switch to using a single atomic and treating 0 as 'uninitialized' 2020-10-08 17:03:16 -07:00
Thom Chiovoloni
e4cf24bd45 Fiddle with the comments 2020-10-08 15:17:35 -07:00
Tomasz Miąsko
6cd5506897 Check for errors returned from posix_spawn*_init functions
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-08 23:53:15 +02:00
Tomasz Miąsko
5faf25b95c Check for non-zero return value from posix_spawn functions
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-08 23:53:15 +02:00
Thom Chiovoloni
f30cc74fb4 Avoid SeqCst or static mut in mach_timebase_info cache 2020-10-08 14:34:11 -07:00
Josh Triplett
16ebf750cf Update libc to 0.2.79
This also fixes issues with inconsistent `unsafe` on functions.
2020-10-04 22:12:07 -07:00
bors
32cbc65e6b Auto merge of #77380 - fusion-engineering-forks:unbox-the-mutex, r=dtolnay
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-04 06:48:17 +00:00
Jonas Schievink
ccc020ab42 Rollup merge of #77182 - GuillaumeGomez:missing-examples-fd-traits, r=pickfire
Add missing examples for Fd traits

Not sure what happened here... This is a reopening of #77142

r? @Dylan-DPC
2020-10-03 00:31:10 +02:00
Jonas Schievink
72d275d844 Rollup merge of #77432 - tmiasko:posix-spawn-musl, r=cuviper
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-02 20:27:11 +02:00
Alexander Mols
8fe6154669 Use posix_spawn() on unix if program is a path
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]: 5f72f9800b/posix/execvpe.c (L81)
2020-10-02 11:11:00 -07:00