diff options
| author | bors <bors@rust-lang.org> | 2020-04-03 20:56:05 +0000 |
|---|---|---|
| committer | bors <bors@rust-lang.org> | 2020-04-03 20:56:05 +0000 |
| commit | 74bd074eefcf4915c73d1ab91bc90859664729e6 (patch) | |
| tree | 4eb869837e228d81b08b2fb4db3ad1af00942039 /src/libstd/sys/hermit | |
| parent | f6fe99c798cb65280a9a56f442b371adcb7b8aa2 (diff) | |
| parent | 4c41ea36cda77748b532cf6d989a8d5d2fcc872e (diff) | |
| download | rust-74bd074eefcf4915c73d1ab91bc90859664729e6.tar.gz rust-74bd074eefcf4915c73d1ab91bc90859664729e6.zip | |
Auto merge of #70747 - Centril:rollup-2vx9bve, r=Centril
Rollup of 9 pull requests Successful merges: - #69860 (Use associated numeric consts in documentation) - #70576 (Update the description of the ticket to point at RFC 1721) - #70597 (Fix double-free and undefined behaviour in libstd::syn::unix::Thread::new) - #70640 (Hide `task_context` when lowering body) - #70641 (Remove duplicated code in trait selection) - #70707 (Remove unused graphviz emitter) - #70720 (Place TLS initializers with relocations in .tdata) - #70735 (Clean up E0502 explanation) - #70741 (Add test for #59023) Failed merges: r? @ghost
Diffstat (limited to 'src/libstd/sys/hermit')
| -rw-r--r-- | src/libstd/sys/hermit/stack_overflow.rs | 8 | ||||
| -rw-r--r-- | src/libstd/sys/hermit/thread.rs | 19 |
2 files changed, 10 insertions, 17 deletions
diff --git a/src/libstd/sys/hermit/stack_overflow.rs b/src/libstd/sys/hermit/stack_overflow.rs index 65a1b17acce..121fe42011d 100644 --- a/src/libstd/sys/hermit/stack_overflow.rs +++ b/src/libstd/sys/hermit/stack_overflow.rs @@ -1,11 +1,3 @@ -pub struct Handler; - -impl Handler { - pub unsafe fn new() -> Handler { - Handler - } -} - #[inline] pub unsafe fn init() {} diff --git a/src/libstd/sys/hermit/thread.rs b/src/libstd/sys/hermit/thread.rs index c3c29c93826..c7bea168f34 100644 --- a/src/libstd/sys/hermit/thread.rs +++ b/src/libstd/sys/hermit/thread.rs @@ -8,8 +8,6 @@ use crate::sys::hermit::abi; use crate::time::Duration; use core::u32; -use crate::sys_common::thread::*; - pub type Tid = abi::Tid; /// Priority of a task @@ -49,26 +47,29 @@ impl Thread { p: Box<dyn FnOnce()>, core_id: isize, ) -> io::Result<Thread> { - let p = box p; + let p = Box::into_raw(box p); let mut tid: Tid = u32::MAX; let ret = abi::spawn( &mut tid as *mut Tid, thread_start, - &*p as *const _ as *const u8 as usize, + p as usize, Priority::into(NORMAL_PRIO), core_id, ); - return if ret == 0 { - mem::forget(p); // ownership passed to pthread_create - Ok(Thread { tid: tid }) - } else { + return if ret != 0 { + // The thread failed to start and as a result p was not consumed. Therefore, it is + // safe to reconstruct the box so that it gets deallocated. + drop(Box::from_raw(p)); Err(io::Error::new(io::ErrorKind::Other, "Unable to create thread!")) + } else { + Ok(Thread { tid: tid }) }; extern "C" fn thread_start(main: usize) { unsafe { - start_thread(main as *mut u8); + // Finally, let's run some code. + Box::from_raw(main as *mut Box<dyn FnOnce()>)(); } } } |
