mirror of
https://github.com/rust-lang/rust.git
synced 2025-05-06 15:07:36 +00:00
Change sys::Thread::new to take the thread entry as Box<dyn FnBox() + 'static>̣
This commit is contained in:
parent
6c03640646
commit
c559216ad0
@ -32,7 +32,8 @@ unsafe impl Send for Thread {}
|
|||||||
unsafe impl Sync for Thread {}
|
unsafe impl Sync for Thread {}
|
||||||
|
|
||||||
impl Thread {
|
impl Thread {
|
||||||
pub unsafe fn new<'a>(stack: usize, p: Box<dyn FnBox() + 'a>) -> io::Result<Thread> {
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(stack: usize, p: Box<dyn FnBox()>) -> io::Result<Thread> {
|
||||||
let p = box p;
|
let p = box p;
|
||||||
let mut native: libc::pthread_t = mem::zeroed();
|
let mut native: libc::pthread_t = mem::zeroed();
|
||||||
let mut attr: libc::pthread_attr_t = mem::zeroed();
|
let mut attr: libc::pthread_attr_t = mem::zeroed();
|
||||||
|
@ -28,7 +28,8 @@ unsafe impl Send for Thread {}
|
|||||||
unsafe impl Sync for Thread {}
|
unsafe impl Sync for Thread {}
|
||||||
|
|
||||||
impl Thread {
|
impl Thread {
|
||||||
pub unsafe fn new<'a>(_stack: usize, p: Box<dyn FnBox() + 'a>) -> io::Result<Thread> {
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(_stack: usize, p: Box<dyn FnBox()>) -> io::Result<Thread> {
|
||||||
let p = box p;
|
let p = box p;
|
||||||
|
|
||||||
let id = cvt(syscall::clone(syscall::CLONE_VM | syscall::CLONE_FS | syscall::CLONE_FILES))?;
|
let id = cvt(syscall::clone(syscall::CLONE_VM | syscall::CLONE_FS | syscall::CLONE_FILES))?;
|
||||||
|
@ -49,7 +49,8 @@ unsafe fn pthread_attr_setstacksize(_attr: *mut libc::pthread_attr_t,
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Thread {
|
impl Thread {
|
||||||
pub unsafe fn new<'a>(stack: usize, p: Box<dyn FnBox() + 'a>)
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(stack: usize, p: Box<dyn FnBox()>)
|
||||||
-> io::Result<Thread> {
|
-> io::Result<Thread> {
|
||||||
let p = box p;
|
let p = box p;
|
||||||
let mut native: libc::pthread_t = mem::zeroed();
|
let mut native: libc::pthread_t = mem::zeroed();
|
||||||
|
@ -19,7 +19,8 @@ pub struct Thread(Void);
|
|||||||
pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;
|
pub const DEFAULT_MIN_STACK_SIZE: usize = 4096;
|
||||||
|
|
||||||
impl Thread {
|
impl Thread {
|
||||||
pub unsafe fn new<'a>(_stack: usize, _p: Box<dyn FnBox() + 'a>)
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(_stack: usize, _p: Box<dyn FnBox()>)
|
||||||
-> io::Result<Thread>
|
-> io::Result<Thread>
|
||||||
{
|
{
|
||||||
unsupported()
|
unsupported()
|
||||||
|
@ -28,7 +28,8 @@ pub struct Thread {
|
|||||||
}
|
}
|
||||||
|
|
||||||
impl Thread {
|
impl Thread {
|
||||||
pub unsafe fn new<'a>(stack: usize, p: Box<dyn FnBox() + 'a>)
|
// unsafe: see thread::Builder::spawn_unchecked for safety requirements
|
||||||
|
pub unsafe fn new(stack: usize, p: Box<dyn FnBox()>)
|
||||||
-> io::Result<Thread> {
|
-> io::Result<Thread> {
|
||||||
let p = box p;
|
let p = box p;
|
||||||
|
|
||||||
|
@ -167,10 +167,12 @@
|
|||||||
#![stable(feature = "rust1", since = "1.0.0")]
|
#![stable(feature = "rust1", since = "1.0.0")]
|
||||||
|
|
||||||
use any::Any;
|
use any::Any;
|
||||||
|
use boxed::FnBox;
|
||||||
use cell::UnsafeCell;
|
use cell::UnsafeCell;
|
||||||
use ffi::{CStr, CString};
|
use ffi::{CStr, CString};
|
||||||
use fmt;
|
use fmt;
|
||||||
use io;
|
use io;
|
||||||
|
use mem;
|
||||||
use panic;
|
use panic;
|
||||||
use panicking;
|
use panicking;
|
||||||
use str;
|
use str;
|
||||||
@ -452,8 +454,8 @@ impl Builder {
|
|||||||
/// [`io::Result`]: ../../std/io/type.Result.html
|
/// [`io::Result`]: ../../std/io/type.Result.html
|
||||||
/// [`JoinHandle`]: ../../std/thread/struct.JoinHandle.html
|
/// [`JoinHandle`]: ../../std/thread/struct.JoinHandle.html
|
||||||
#[unstable(feature = "thread_spawn_unchecked", issue = "55132")]
|
#[unstable(feature = "thread_spawn_unchecked", issue = "55132")]
|
||||||
pub unsafe fn spawn_unchecked<F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
|
pub unsafe fn spawn_unchecked<'a, F, T>(self, f: F) -> io::Result<JoinHandle<T>> where
|
||||||
F: FnOnce() -> T, F: Send, T: Send
|
F: FnOnce() -> T, F: Send + 'a, T: Send + 'a
|
||||||
{
|
{
|
||||||
let Builder { name, stack_size } = self;
|
let Builder { name, stack_size } = self;
|
||||||
|
|
||||||
@ -482,7 +484,21 @@ impl Builder {
|
|||||||
};
|
};
|
||||||
|
|
||||||
Ok(JoinHandle(JoinInner {
|
Ok(JoinHandle(JoinInner {
|
||||||
native: Some(imp::Thread::new(stack_size, Box::new(main))?),
|
// `imp::Thread::new` takes a closure with a `'static` lifetime, since it's passed
|
||||||
|
// through FFI or otherwise used with low-level threading primitives that have no
|
||||||
|
// notion of or way to enforce lifetimes.
|
||||||
|
//
|
||||||
|
// As mentioned in the `Safety` section of this function's documentation, the caller of
|
||||||
|
// this function needs to guarantee that the passed-in lifetime is sufficiently long
|
||||||
|
// for the lifetime of the thread.
|
||||||
|
//
|
||||||
|
// Similarly, the `sys` implementation must guarantee that no references to the closure
|
||||||
|
// exist after the thread has terminated, which is signaled by `Thread::join`
|
||||||
|
// returning.
|
||||||
|
native: Some(imp::Thread::new(
|
||||||
|
stack_size,
|
||||||
|
mem::transmute::<Box<dyn FnBox() + 'a>, Box<dyn FnBox() + 'static>>(Box::new(main))
|
||||||
|
)?),
|
||||||
thread: my_thread,
|
thread: my_thread,
|
||||||
packet: Packet(my_packet),
|
packet: Packet(my_packet),
|
||||||
}))
|
}))
|
||||||
|
Loading…
Reference in New Issue
Block a user