a27fbac868
This commit is part of a series that introduces a `std::thread` API to replace `std::task`. In the new API, `spawn` returns a `JoinGuard`, which by default will join the spawned thread when dropped. It can also be used to join explicitly at any time, returning the thread's result. Alternatively, the spawned thread can be explicitly detached (so no join takes place). As part of this change, Rust processes now terminate when the main thread exits, even if other detached threads are still running, moving Rust closer to standard threading models. This new behavior may break code that was relying on the previously implicit join-all. In addition to the above, the new thread API also offers some built-in support for building blocking abstractions in user space; see the module doc for details. Closes #18000 [breaking-change]
56 lines
1.3 KiB
Rust
56 lines
1.3 KiB
Rust
// Copyright 2014 The Rust Project Developers. See the COPYRIGHT
|
|
// file at the top-level directory of this distribution and at
|
|
// http://rust-lang.org/COPYRIGHT.
|
|
//
|
|
// Licensed under the Apache License, Version 2.0 <LICENSE-APACHE or
|
|
// http://www.apache.org/licenses/LICENSE-2.0> or the MIT license
|
|
// <LICENSE-MIT or http://opensource.org/licenses/MIT>, at your
|
|
// option. This file may not be copied, modified, or distributed
|
|
// except according to those terms.
|
|
|
|
// Because this module is temporary...
|
|
#![allow(missing_docs)]
|
|
|
|
use alloc::boxed::Box;
|
|
use core::kinds::Send;
|
|
use core::ops::FnOnce;
|
|
|
|
pub struct Thunk<A=(),R=()> {
|
|
invoke: Box<Invoke<A,R>+Send>
|
|
}
|
|
|
|
impl<R> Thunk<(),R> {
|
|
pub fn new<F>(func: F) -> Thunk<(),R>
|
|
where F : FnOnce() -> R, F : Send
|
|
{
|
|
Thunk::with_arg(move|: ()| func())
|
|
}
|
|
}
|
|
|
|
impl<A,R> Thunk<A,R> {
|
|
pub fn with_arg<F>(func: F) -> Thunk<A,R>
|
|
where F : FnOnce(A) -> R, F : Send
|
|
{
|
|
Thunk {
|
|
invoke: box func
|
|
}
|
|
}
|
|
|
|
pub fn invoke(self, arg: A) -> R {
|
|
self.invoke.invoke(arg)
|
|
}
|
|
}
|
|
|
|
pub trait Invoke<A=(),R=()> {
|
|
fn invoke(self: Box<Self>, arg: A) -> R;
|
|
}
|
|
|
|
impl<A,R,F> Invoke<A,R> for F
|
|
where F : FnOnce(A) -> R
|
|
{
|
|
fn invoke(self: Box<F>, arg: A) -> R {
|
|
let f = *self;
|
|
f(arg)
|
|
}
|
|
}
|