diff options
| author | Alex Crichton <alex@alexcrichton.com> | 2014-12-19 11:29:39 -0800 |
|---|---|---|
| committer | Alex Crichton <alex@alexcrichton.com> | 2014-12-30 14:33:59 -0800 |
| commit | 9e224c2bf18ebf8f871efb2e1aba43ed7970ebb7 (patch) | |
| tree | da18d5791e6841a1aa6a9469baca155d4ca9828d /src/libstd/sys/unix/process.rs | |
| parent | d2368c3c11ddab9d812c4ddec2e44579326ad347 (diff) | |
| download | rust-9e224c2bf18ebf8f871efb2e1aba43ed7970ebb7.tar.gz rust-9e224c2bf18ebf8f871efb2e1aba43ed7970ebb7.zip | |
std: Re-enable at_exit()
The new semantics of this function are that the callbacks are run when the *main thread* exits, not when all threads have exited. This implies that other threads may still be running when the `at_exit` callbacks are invoked and users need to be prepared for this situation. Users in the standard library have been audited in accordance to these new rules as well. Closes #20012
Diffstat (limited to 'src/libstd/sys/unix/process.rs')
| -rw-r--r-- | src/libstd/sys/unix/process.rs | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/src/libstd/sys/unix/process.rs b/src/libstd/sys/unix/process.rs index 835f4279d9b..48df8c4eced 100644 --- a/src/libstd/sys/unix/process.rs +++ b/src/libstd/sys/unix/process.rs @@ -11,7 +11,7 @@ use self::Req::*; use libc::{mod, pid_t, c_void, c_int}; use c_str::CString; -use io::{mod, IoResult, IoError, EndOfFile}; +use io::{IoResult, EndOfFile}; use mem; use os; use ptr; @@ -327,7 +327,7 @@ impl Process { // The actual communication between the helper thread and this thread is // quite simple, just a channel moving data around. - unsafe { HELPER.boot(register_sigchld, waitpid_helper) } + HELPER.boot(register_sigchld, waitpid_helper); match self.try_wait() { Some(ret) => return Ok(ret), @@ -335,7 +335,7 @@ impl Process { } let (tx, rx) = channel(); - unsafe { HELPER.send(NewChild(self.pid, tx, deadline)); } + HELPER.send(NewChild(self.pid, tx, deadline)); return match rx.recv_opt() { Ok(e) => Ok(e), Err(()) => Err(timeout("wait timed out")), @@ -419,8 +419,15 @@ impl Process { Ok(NewChild(pid, tx, deadline)) => { active.push((pid, tx, deadline)); } + // Once we've been disconnected it means the main + // thread is exiting (at_exit has run). We could + // still have active waiter for other threads, so + // we're just going to drop them all on the floor. + // This means that they won't receive a "you're + // done" message in which case they'll be considered + // as timed out, but more generally errors will + // start propagating. Err(comm::Disconnected) => { - assert!(active.len() == 0); break 'outer; } Err(comm::Empty) => break, |
