Update the libraries to reflect Send loosing the 'static bound.
In most places this preserves the current API by adding an explicit `'static` bound. Notably absent are some impls like `unsafe impl<T: Send> Send for Foo<T>` and the `std::thread` module. It is likely that it will be possible to remove these after auditing the code to ensure restricted lifetimes are safe. More progress on #22251.
This commit is contained in:
parent
cae969e2a7
commit
d7b5bc3c2f
@ -20,7 +20,7 @@ use mem;
|
||||
use thunk::Thunk;
|
||||
use sys_common::mutex::{Mutex, MUTEX_INIT};
|
||||
|
||||
type Queue = Vec<Thunk>;
|
||||
type Queue = Vec<Thunk<'static>>;
|
||||
|
||||
// NB these are specifically not types from `std::sync` as they currently rely
|
||||
// on poisoning and this module needs to operate at a lower level than requiring
|
||||
@ -65,7 +65,7 @@ pub fn cleanup() {
|
||||
}
|
||||
}
|
||||
|
||||
pub fn push(f: Thunk) {
|
||||
pub fn push(f: Thunk<'static>) {
|
||||
unsafe {
|
||||
LOCK.lock();
|
||||
init();
|
||||
|
@ -148,7 +148,7 @@ fn lang_start(main: *const u8, argc: int, argv: *const *const u8) -> int {
|
||||
///
|
||||
/// It is forbidden for procedures to register more `at_exit` handlers when they
|
||||
/// are running, and doing so will lead to a process abort.
|
||||
pub fn at_exit<F:FnOnce()+Send>(f: F) {
|
||||
pub fn at_exit<F:FnOnce()+Send+'static>(f: F) {
|
||||
at_exit_imp::push(Thunk::new(f));
|
||||
}
|
||||
|
||||
|
@ -74,7 +74,7 @@ use rt::libunwind as uw;
|
||||
|
||||
struct Exception {
|
||||
uwe: uw::_Unwind_Exception,
|
||||
cause: Option<Box<Any + Send>>,
|
||||
cause: Option<Box<Any + Send + 'static>>,
|
||||
}
|
||||
|
||||
pub type Callback = fn(msg: &(Any + Send), file: &'static str, line: uint);
|
||||
@ -161,7 +161,7 @@ pub fn panicking() -> bool {
|
||||
#[inline(never)]
|
||||
#[no_mangle]
|
||||
#[allow(private_no_mangle_fns)]
|
||||
fn rust_panic(cause: Box<Any + Send>) -> ! {
|
||||
fn rust_panic(cause: Box<Any + Send + 'static>) -> ! {
|
||||
rtdebug!("begin_unwind()");
|
||||
|
||||
unsafe {
|
||||
|
@ -46,7 +46,7 @@ pub struct Future<A> {
|
||||
}
|
||||
|
||||
enum FutureState<A> {
|
||||
Pending(Thunk<(),A>),
|
||||
Pending(Thunk<'static,(),A>),
|
||||
Evaluating,
|
||||
Forced(A)
|
||||
}
|
||||
@ -103,7 +103,7 @@ impl<A> Future<A> {
|
||||
}
|
||||
|
||||
pub fn from_fn<F>(f: F) -> Future<A>
|
||||
where F : FnOnce() -> A, F : Send
|
||||
where F : FnOnce() -> A, F : Send + 'static
|
||||
{
|
||||
/*!
|
||||
* Create a future from a function.
|
||||
@ -117,7 +117,7 @@ impl<A> Future<A> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<A:Send> Future<A> {
|
||||
impl<A:Send+'static> Future<A> {
|
||||
pub fn from_receiver(rx: Receiver<A>) -> Future<A> {
|
||||
/*!
|
||||
* Create a future from a port
|
||||
@ -132,7 +132,7 @@ impl<A:Send> Future<A> {
|
||||
}
|
||||
|
||||
pub fn spawn<F>(blk: F) -> Future<A>
|
||||
where F : FnOnce() -> A, F : Send
|
||||
where F : FnOnce() -> A, F : Send + 'static
|
||||
{
|
||||
/*!
|
||||
* Create a future from a unique closure.
|
||||
|
@ -345,7 +345,7 @@ pub struct Receiver<T> {
|
||||
|
||||
// The receiver port can be sent from place to place, so long as it
|
||||
// is not used to receive non-sendable things.
|
||||
unsafe impl<T:Send> Send for Receiver<T> { }
|
||||
unsafe impl<T: Send + 'static> Send for Receiver<T> { }
|
||||
|
||||
/// An iterator over messages on a receiver, this iterator will block
|
||||
/// whenever `next` is called, waiting for a new message, and `None` will be
|
||||
@ -364,7 +364,7 @@ pub struct Sender<T> {
|
||||
|
||||
// The send port can be sent from place to place, so long as it
|
||||
// is not used to send non-sendable things.
|
||||
unsafe impl<T:Send> Send for Sender<T> { }
|
||||
unsafe impl<T: Send + 'static> Send for Sender<T> { }
|
||||
|
||||
/// The sending-half of Rust's synchronous channel type. This half can only be
|
||||
/// owned by one task, but it can be cloned to send to other tasks.
|
||||
@ -373,7 +373,7 @@ pub struct SyncSender<T> {
|
||||
inner: Arc<UnsafeCell<sync::Packet<T>>>,
|
||||
}
|
||||
|
||||
unsafe impl<T:Send> Send for SyncSender<T> {}
|
||||
unsafe impl<T: Send + 'static> Send for SyncSender<T> {}
|
||||
|
||||
impl<T> !Sync for SyncSender<T> {}
|
||||
|
||||
@ -485,7 +485,7 @@ impl<T> UnsafeFlavor<T> for Receiver<T> {
|
||||
/// println!("{:?}", rx.recv().unwrap());
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
|
||||
pub fn channel<T: Send + 'static>() -> (Sender<T>, Receiver<T>) {
|
||||
let a = Arc::new(UnsafeCell::new(oneshot::Packet::new()));
|
||||
(Sender::new(Flavor::Oneshot(a.clone())), Receiver::new(Flavor::Oneshot(a)))
|
||||
}
|
||||
@ -525,7 +525,7 @@ pub fn channel<T: Send>() -> (Sender<T>, Receiver<T>) {
|
||||
/// assert_eq!(rx.recv().unwrap(), 2);
|
||||
/// ```
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
|
||||
pub fn sync_channel<T: Send + 'static>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
|
||||
let a = Arc::new(UnsafeCell::new(sync::Packet::new(bound)));
|
||||
(SyncSender::new(a.clone()), Receiver::new(Flavor::Sync(a)))
|
||||
}
|
||||
@ -534,7 +534,7 @@ pub fn sync_channel<T: Send>(bound: uint) -> (SyncSender<T>, Receiver<T>) {
|
||||
// Sender
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
impl<T: Send> Sender<T> {
|
||||
impl<T: Send + 'static> Sender<T> {
|
||||
fn new(inner: Flavor<T>) -> Sender<T> {
|
||||
Sender {
|
||||
inner: UnsafeCell::new(inner),
|
||||
@ -616,7 +616,7 @@ impl<T: Send> Sender<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Clone for Sender<T> {
|
||||
impl<T: Send + 'static> Clone for Sender<T> {
|
||||
fn clone(&self) -> Sender<T> {
|
||||
let (packet, sleeper, guard) = match *unsafe { self.inner() } {
|
||||
Flavor::Oneshot(ref p) => {
|
||||
@ -662,7 +662,7 @@ impl<T: Send> Clone for Sender<T> {
|
||||
|
||||
#[unsafe_destructor]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Drop for Sender<T> {
|
||||
impl<T: Send + 'static> Drop for Sender<T> {
|
||||
fn drop(&mut self) {
|
||||
match *unsafe { self.inner_mut() } {
|
||||
Flavor::Oneshot(ref mut p) => unsafe { (*p.get()).drop_chan(); },
|
||||
@ -677,7 +677,7 @@ impl<T: Send> Drop for Sender<T> {
|
||||
// SyncSender
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
impl<T: Send> SyncSender<T> {
|
||||
impl<T: Send + 'static> SyncSender<T> {
|
||||
fn new(inner: Arc<UnsafeCell<sync::Packet<T>>>) -> SyncSender<T> {
|
||||
SyncSender { inner: inner }
|
||||
}
|
||||
@ -717,7 +717,7 @@ impl<T: Send> SyncSender<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Clone for SyncSender<T> {
|
||||
impl<T: Send + 'static> Clone for SyncSender<T> {
|
||||
fn clone(&self) -> SyncSender<T> {
|
||||
unsafe { (*self.inner.get()).clone_chan(); }
|
||||
return SyncSender::new(self.inner.clone());
|
||||
@ -726,7 +726,7 @@ impl<T: Send> Clone for SyncSender<T> {
|
||||
|
||||
#[unsafe_destructor]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Drop for SyncSender<T> {
|
||||
impl<T: Send + 'static> Drop for SyncSender<T> {
|
||||
fn drop(&mut self) {
|
||||
unsafe { (*self.inner.get()).drop_chan(); }
|
||||
}
|
||||
@ -736,7 +736,7 @@ impl<T: Send> Drop for SyncSender<T> {
|
||||
// Receiver
|
||||
////////////////////////////////////////////////////////////////////////////////
|
||||
|
||||
impl<T: Send> Receiver<T> {
|
||||
impl<T: Send + 'static> Receiver<T> {
|
||||
fn new(inner: Flavor<T>) -> Receiver<T> {
|
||||
Receiver { inner: UnsafeCell::new(inner) }
|
||||
}
|
||||
@ -855,7 +855,7 @@ impl<T: Send> Receiver<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Send> select::Packet for Receiver<T> {
|
||||
impl<T: Send + 'static> select::Packet for Receiver<T> {
|
||||
fn can_recv(&self) -> bool {
|
||||
loop {
|
||||
let new_port = match *unsafe { self.inner() } {
|
||||
@ -942,7 +942,7 @@ impl<T: Send> select::Packet for Receiver<T> {
|
||||
}
|
||||
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<'a, T: Send> Iterator for Iter<'a, T> {
|
||||
impl<'a, T: Send + 'static> Iterator for Iter<'a, T> {
|
||||
type Item = T;
|
||||
|
||||
fn next(&mut self) -> Option<T> { self.rx.recv().ok() }
|
||||
@ -950,7 +950,7 @@ impl<'a, T: Send> Iterator for Iter<'a, T> {
|
||||
|
||||
#[unsafe_destructor]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Drop for Receiver<T> {
|
||||
impl<T: Send + 'static> Drop for Receiver<T> {
|
||||
fn drop(&mut self) {
|
||||
match *unsafe { self.inner_mut() } {
|
||||
Flavor::Oneshot(ref mut p) => unsafe { (*p.get()).drop_port(); },
|
||||
|
@ -78,7 +78,7 @@ pub struct Queue<T> {
|
||||
}
|
||||
|
||||
unsafe impl<T:Send> Send for Queue<T> { }
|
||||
unsafe impl<T:Send> Sync for Queue<T> { }
|
||||
unsafe impl<T: Send + 'static> Sync for Queue<T> { }
|
||||
|
||||
impl<T> Node<T> {
|
||||
unsafe fn new(v: Option<T>) -> *mut Node<T> {
|
||||
@ -89,7 +89,7 @@ impl<T> Node<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Send> Queue<T> {
|
||||
impl<T: Send + 'static> Queue<T> {
|
||||
/// Creates a new queue that is safe to share among multiple producers and
|
||||
/// one consumer.
|
||||
pub fn new() -> Queue<T> {
|
||||
@ -140,7 +140,7 @@ impl<T: Send> Queue<T> {
|
||||
|
||||
#[unsafe_destructor]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Drop for Queue<T> {
|
||||
impl<T: Send + 'static> Drop for Queue<T> {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
let mut cur = *self.tail.get();
|
||||
|
@ -88,7 +88,7 @@ enum MyUpgrade<T> {
|
||||
GoUp(Receiver<T>),
|
||||
}
|
||||
|
||||
impl<T: Send> Packet<T> {
|
||||
impl<T: Send + 'static> Packet<T> {
|
||||
pub fn new() -> Packet<T> {
|
||||
Packet {
|
||||
data: None,
|
||||
@ -368,7 +368,7 @@ impl<T: Send> Packet<T> {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<T: Send> Drop for Packet<T> {
|
||||
impl<T: Send + 'static> Drop for Packet<T> {
|
||||
fn drop(&mut self) {
|
||||
assert_eq!(self.state.load(Ordering::SeqCst), DISCONNECTED);
|
||||
}
|
||||
|
@ -134,7 +134,7 @@ impl Select {
|
||||
/// Creates a new handle into this receiver set for a new receiver. Note
|
||||
/// that this does *not* add the receiver to the receiver set, for that you
|
||||
/// must call the `add` method on the handle itself.
|
||||
pub fn handle<'a, T: Send>(&'a self, rx: &'a Receiver<T>) -> Handle<'a, T> {
|
||||
pub fn handle<'a, T: Send + 'static>(&'a self, rx: &'a Receiver<T>) -> Handle<'a, T> {
|
||||
let id = self.next_id.get();
|
||||
self.next_id.set(id + 1);
|
||||
Handle {
|
||||
@ -251,7 +251,7 @@ impl Select {
|
||||
fn iter(&self) -> Packets { Packets { cur: self.head } }
|
||||
}
|
||||
|
||||
impl<'rx, T: Send> Handle<'rx, T> {
|
||||
impl<'rx, T: Send + 'static> Handle<'rx, T> {
|
||||
/// Retrieve the id of this handle.
|
||||
#[inline]
|
||||
pub fn id(&self) -> uint { self.id }
|
||||
@ -322,7 +322,7 @@ impl Drop for Select {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<'rx, T: Send> Drop for Handle<'rx, T> {
|
||||
impl<'rx, T: Send + 'static> Drop for Handle<'rx, T> {
|
||||
fn drop(&mut self) {
|
||||
unsafe { self.remove() }
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ pub enum Failure {
|
||||
Disconnected,
|
||||
}
|
||||
|
||||
impl<T: Send> Packet<T> {
|
||||
impl<T: Send + 'static> Packet<T> {
|
||||
// Creation of a packet *must* be followed by a call to postinit_lock
|
||||
// and later by inherit_blocker
|
||||
pub fn new() -> Packet<T> {
|
||||
@ -474,7 +474,7 @@ impl<T: Send> Packet<T> {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<T: Send> Drop for Packet<T> {
|
||||
impl<T: Send + 'static> Drop for Packet<T> {
|
||||
fn drop(&mut self) {
|
||||
// Note that this load is not only an assert for correctness about
|
||||
// disconnection, but also a proper fence before the read of
|
||||
|
@ -74,11 +74,11 @@ pub struct Queue<T> {
|
||||
cache_subtractions: AtomicUsize,
|
||||
}
|
||||
|
||||
unsafe impl<T: Send> Send for Queue<T> { }
|
||||
unsafe impl<T: Send + 'static> Send for Queue<T> { }
|
||||
|
||||
unsafe impl<T: Send> Sync for Queue<T> { }
|
||||
unsafe impl<T: Send + 'static> Sync for Queue<T> { }
|
||||
|
||||
impl<T: Send> Node<T> {
|
||||
impl<T: Send + 'static> Node<T> {
|
||||
fn new() -> *mut Node<T> {
|
||||
unsafe {
|
||||
mem::transmute(box Node {
|
||||
@ -89,7 +89,7 @@ impl<T: Send> Node<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Send> Queue<T> {
|
||||
impl<T: Send + 'static> Queue<T> {
|
||||
/// Creates a new queue.
|
||||
///
|
||||
/// This is unsafe as the type system doesn't enforce a single
|
||||
@ -227,7 +227,7 @@ impl<T: Send> Queue<T> {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<T: Send> Drop for Queue<T> {
|
||||
impl<T: Send + 'static> Drop for Queue<T> {
|
||||
fn drop(&mut self) {
|
||||
unsafe {
|
||||
let mut cur = *self.first.get();
|
||||
|
@ -74,7 +74,7 @@ enum Message<T> {
|
||||
GoUp(Receiver<T>),
|
||||
}
|
||||
|
||||
impl<T: Send> Packet<T> {
|
||||
impl<T: Send + 'static> Packet<T> {
|
||||
pub fn new() -> Packet<T> {
|
||||
Packet {
|
||||
queue: unsafe { spsc::Queue::new(128) },
|
||||
@ -472,7 +472,7 @@ impl<T: Send> Packet<T> {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<T: Send> Drop for Packet<T> {
|
||||
impl<T: Send + 'static> Drop for Packet<T> {
|
||||
fn drop(&mut self) {
|
||||
// Note that this load is not only an assert for correctness about
|
||||
// disconnection, but also a proper fence before the read of
|
||||
|
@ -55,9 +55,9 @@ pub struct Packet<T> {
|
||||
lock: Mutex<State<T>>,
|
||||
}
|
||||
|
||||
unsafe impl<T:Send> Send for Packet<T> { }
|
||||
unsafe impl<T: Send + 'static> Send for Packet<T> { }
|
||||
|
||||
unsafe impl<T:Send> Sync for Packet<T> { }
|
||||
unsafe impl<T: Send + 'static> Sync for Packet<T> { }
|
||||
|
||||
struct State<T> {
|
||||
disconnected: bool, // Is the channel disconnected yet?
|
||||
@ -75,7 +75,7 @@ struct State<T> {
|
||||
canceled: Option<&'static mut bool>,
|
||||
}
|
||||
|
||||
unsafe impl<T: Send> Send for State<T> {}
|
||||
unsafe impl<T: Send + 'static> Send for State<T> {}
|
||||
|
||||
/// Possible flavors of threads who can be blocked on this channel.
|
||||
enum Blocker {
|
||||
@ -113,7 +113,7 @@ pub enum Failure {
|
||||
|
||||
/// Atomically blocks the current thread, placing it into `slot`, unlocking `lock`
|
||||
/// in the meantime. This re-locks the mutex upon returning.
|
||||
fn wait<'a, 'b, T: Send>(lock: &'a Mutex<State<T>>,
|
||||
fn wait<'a, 'b, T: Send + 'static>(lock: &'a Mutex<State<T>>,
|
||||
mut guard: MutexGuard<'b, State<T>>,
|
||||
f: fn(SignalToken) -> Blocker)
|
||||
-> MutexGuard<'a, State<T>>
|
||||
@ -136,7 +136,7 @@ fn wakeup<T>(token: SignalToken, guard: MutexGuard<State<T>>) {
|
||||
token.signal();
|
||||
}
|
||||
|
||||
impl<T: Send> Packet<T> {
|
||||
impl<T: Send + 'static> Packet<T> {
|
||||
pub fn new(cap: uint) -> Packet<T> {
|
||||
Packet {
|
||||
channels: AtomicUsize::new(1),
|
||||
@ -412,7 +412,7 @@ impl<T: Send> Packet<T> {
|
||||
}
|
||||
|
||||
#[unsafe_destructor]
|
||||
impl<T: Send> Drop for Packet<T> {
|
||||
impl<T: Send + 'static> Drop for Packet<T> {
|
||||
fn drop(&mut self) {
|
||||
assert_eq!(self.channels.load(Ordering::SeqCst), 0);
|
||||
let mut guard = self.lock.lock().unwrap();
|
||||
|
@ -120,9 +120,9 @@ pub struct Mutex<T> {
|
||||
data: UnsafeCell<T>,
|
||||
}
|
||||
|
||||
unsafe impl<T:Send> Send for Mutex<T> { }
|
||||
unsafe impl<T: Send + 'static> Send for Mutex<T> { }
|
||||
|
||||
unsafe impl<T:Send> Sync for Mutex<T> { }
|
||||
unsafe impl<T: Send + 'static> Sync for Mutex<T> { }
|
||||
|
||||
/// The static mutex type is provided to allow for static allocation of mutexes.
|
||||
///
|
||||
@ -180,7 +180,7 @@ pub const MUTEX_INIT: StaticMutex = StaticMutex {
|
||||
poison: poison::FLAG_INIT,
|
||||
};
|
||||
|
||||
impl<T: Send> Mutex<T> {
|
||||
impl<T: Send + 'static> Mutex<T> {
|
||||
/// Creates a new mutex in an unlocked state ready for use.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub fn new(t: T) -> Mutex<T> {
|
||||
@ -243,7 +243,7 @@ impl<T: Send> Mutex<T> {
|
||||
|
||||
#[unsafe_destructor]
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
impl<T: Send> Drop for Mutex<T> {
|
||||
impl<T: Send + 'static> Drop for Mutex<T> {
|
||||
fn drop(&mut self) {
|
||||
// This is actually safe b/c we know that there is no further usage of
|
||||
// this mutex (it's up to the user to arrange for a mutex to get
|
||||
|
@ -24,12 +24,12 @@ use thread::Thread;
|
||||
use thunk::Thunk;
|
||||
|
||||
struct Sentinel<'a> {
|
||||
jobs: &'a Arc<Mutex<Receiver<Thunk>>>,
|
||||
jobs: &'a Arc<Mutex<Receiver<Thunk<'static>>>>,
|
||||
active: bool
|
||||
}
|
||||
|
||||
impl<'a> Sentinel<'a> {
|
||||
fn new(jobs: &Arc<Mutex<Receiver<Thunk>>>) -> Sentinel {
|
||||
fn new(jobs: &'a Arc<Mutex<Receiver<Thunk<'static>>>>) -> Sentinel<'a> {
|
||||
Sentinel {
|
||||
jobs: jobs,
|
||||
active: true
|
||||
@ -80,7 +80,7 @@ pub struct TaskPool {
|
||||
//
|
||||
// This is the only such Sender, so when it is dropped all subthreads will
|
||||
// quit.
|
||||
jobs: Sender<Thunk>
|
||||
jobs: Sender<Thunk<'static>>
|
||||
}
|
||||
|
||||
impl TaskPool {
|
||||
@ -105,13 +105,13 @@ impl TaskPool {
|
||||
|
||||
/// Executes the function `job` on a thread in the pool.
|
||||
pub fn execute<F>(&self, job: F)
|
||||
where F : FnOnce(), F : Send
|
||||
where F : FnOnce(), F : Send + 'static
|
||||
{
|
||||
self.jobs.send(Thunk::new(job)).unwrap();
|
||||
}
|
||||
}
|
||||
|
||||
fn spawn_in_pool(jobs: Arc<Mutex<Receiver<Thunk>>>) {
|
||||
fn spawn_in_pool(jobs: Arc<Mutex<Receiver<Thunk<'static>>>>) {
|
||||
Thread::spawn(move || {
|
||||
// Will spawn a new thread on panic unless it is cancelled.
|
||||
let sentinel = Sentinel::new(&jobs);
|
||||
|
@ -81,7 +81,7 @@ impl<M: Send> Helper<M> {
|
||||
///
|
||||
/// This function is safe to be called many times.
|
||||
pub fn boot<T, F>(&'static self, f: F, helper: fn(helper_signal::signal, Receiver<M>, T)) where
|
||||
T: Send,
|
||||
T: Send + 'static,
|
||||
F: FnOnce() -> T,
|
||||
{
|
||||
unsafe {
|
||||
|
@ -175,9 +175,9 @@ pub struct Builder {
|
||||
// The size of the stack for the spawned thread
|
||||
stack_size: Option<uint>,
|
||||
// Thread-local stdout
|
||||
stdout: Option<Box<Writer + Send>>,
|
||||
stdout: Option<Box<Writer + Send + 'static>>,
|
||||
// Thread-local stderr
|
||||
stderr: Option<Box<Writer + Send>>,
|
||||
stderr: Option<Box<Writer + Send + 'static>>,
|
||||
}
|
||||
|
||||
impl Builder {
|
||||
@ -211,7 +211,7 @@ impl Builder {
|
||||
/// Redirect thread-local stdout.
|
||||
#[unstable(feature = "std_misc",
|
||||
reason = "Will likely go away after proc removal")]
|
||||
pub fn stdout(mut self, stdout: Box<Writer + Send>) -> Builder {
|
||||
pub fn stdout(mut self, stdout: Box<Writer + Send + 'static>) -> Builder {
|
||||
self.stdout = Some(stdout);
|
||||
self
|
||||
}
|
||||
@ -219,7 +219,7 @@ impl Builder {
|
||||
/// Redirect thread-local stderr.
|
||||
#[unstable(feature = "std_misc",
|
||||
reason = "Will likely go away after proc removal")]
|
||||
pub fn stderr(mut self, stderr: Box<Writer + Send>) -> Builder {
|
||||
pub fn stderr(mut self, stderr: Box<Writer + Send + 'static>) -> Builder {
|
||||
self.stderr = Some(stderr);
|
||||
self
|
||||
}
|
||||
@ -469,11 +469,11 @@ impl thread_info::NewThread for Thread {
|
||||
///
|
||||
/// A thread that completes without panicking is considered to exit successfully.
|
||||
#[stable(feature = "rust1", since = "1.0.0")]
|
||||
pub type Result<T> = ::result::Result<T, Box<Any + Send>>;
|
||||
pub type Result<T> = ::result::Result<T, Box<Any + Send + 'static>>;
|
||||
|
||||
struct Packet<T>(Arc<UnsafeCell<Option<Result<T>>>>);
|
||||
|
||||
unsafe impl<T:'static+Send> Send for Packet<T> {}
|
||||
unsafe impl<T:Send> Send for Packet<T> {}
|
||||
unsafe impl<T> Sync for Packet<T> {}
|
||||
|
||||
/// An RAII-style guard that will block until thread termination when dropped.
|
||||
@ -515,7 +515,7 @@ impl<'a, T: Send + 'a> JoinGuard<'a, T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Send> JoinGuard<'static, T> {
|
||||
impl<T: Send + 'static> JoinGuard<'static, T> {
|
||||
/// Detaches the child thread, allowing it to outlive its parent.
|
||||
#[unstable(feature = "std_misc",
|
||||
reason = "unsure whether this API imposes limitations elsewhere")]
|
||||
|
@ -16,21 +16,24 @@ use alloc::boxed::Box;
|
||||
use core::marker::Send;
|
||||
use core::ops::FnOnce;
|
||||
|
||||
pub struct Thunk<A=(),R=()> {
|
||||
invoke: Box<Invoke<A,R>+Send>
|
||||
pub struct Thunk<'a, A=(),R=()> {
|
||||
#[cfg(stage0)] // // SNAP ac134f7 remove after stage0
|
||||
invoke: Box<Invoke<A,R>+Send>,
|
||||
#[cfg(not(stage0))]
|
||||
invoke: Box<Invoke<A,R>+Send + 'a>,
|
||||
}
|
||||
|
||||
impl<R> Thunk<(),R> {
|
||||
pub fn new<F>(func: F) -> Thunk<(),R>
|
||||
where F : FnOnce() -> R, F : Send
|
||||
impl<'a, R> Thunk<'a,(),R> {
|
||||
pub fn new<F>(func: F) -> Thunk<'a,(),R>
|
||||
where F : FnOnce() -> R, F : Send + 'a
|
||||
{
|
||||
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
|
||||
impl<'a,A,R> Thunk<'a,A,R> {
|
||||
pub fn with_arg<F>(func: F) -> Thunk<'a,A,R>
|
||||
where F : FnOnce(A) -> R, F : Send + 'a
|
||||
{
|
||||
Thunk {
|
||||
invoke: box func
|
||||
|
@ -72,7 +72,7 @@ pub struct TerminfoTerminal<T> {
|
||||
ti: Box<TermInfo>
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> Terminal<T> for TerminfoTerminal<T> {
|
||||
impl<T: Writer+Send+'static> Terminal<T> for TerminfoTerminal<T> {
|
||||
fn fg(&mut self, color: color::Color) -> IoResult<bool> {
|
||||
let color = self.dim_if_necessary(color);
|
||||
if self.num_colors > color {
|
||||
@ -164,11 +164,11 @@ impl<T: Writer+Send> Terminal<T> for TerminfoTerminal<T> {
|
||||
fn get_mut<'a>(&'a mut self) -> &'a mut T { &mut self.out }
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> UnwrappableTerminal<T> for TerminfoTerminal<T> {
|
||||
impl<T: Writer+Send+'static> UnwrappableTerminal<T> for TerminfoTerminal<T> {
|
||||
fn unwrap(self) -> T { self.out }
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> TerminfoTerminal<T> {
|
||||
impl<T: Writer+Send+'static> TerminfoTerminal<T> {
|
||||
/// Returns `None` whenever the terminal cannot be created for some
|
||||
/// reason.
|
||||
pub fn new(out: T) -> Option<Box<Terminal<T>+Send+'static>> {
|
||||
@ -229,4 +229,3 @@ impl<T: Writer> Writer for TerminfoTerminal<T> {
|
||||
self.out.flush()
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -86,7 +86,7 @@ fn bits_to_color(bits: u16) -> color::Color {
|
||||
color | (bits & 0x8) // copy the hi-intensity bit
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> WinConsole<T> {
|
||||
impl<T: Writer+Send+'static> WinConsole<T> {
|
||||
fn apply(&mut self) {
|
||||
let _unused = self.buf.flush();
|
||||
let mut accum: libc::WORD = 0;
|
||||
@ -139,7 +139,7 @@ impl<T: Writer> Writer for WinConsole<T> {
|
||||
}
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> Terminal<T> for WinConsole<T> {
|
||||
impl<T: Writer+Send+'static> Terminal<T> for WinConsole<T> {
|
||||
fn fg(&mut self, color: color::Color) -> IoResult<bool> {
|
||||
self.foreground = color;
|
||||
self.apply();
|
||||
@ -192,6 +192,6 @@ impl<T: Writer+Send> Terminal<T> for WinConsole<T> {
|
||||
fn get_mut<'a>(&'a mut self) -> &'a mut T { &mut self.buf }
|
||||
}
|
||||
|
||||
impl<T: Writer+Send> UnwrappableTerminal<T> for WinConsole<T> {
|
||||
impl<T: Writer+Send+'static> UnwrappableTerminal<T> for WinConsole<T> {
|
||||
fn unwrap(self) -> T { self.buf }
|
||||
}
|
||||
|
@ -154,7 +154,7 @@ pub enum TestFn {
|
||||
StaticTestFn(fn()),
|
||||
StaticBenchFn(fn(&mut Bencher)),
|
||||
StaticMetricFn(fn(&mut MetricMap)),
|
||||
DynTestFn(Thunk),
|
||||
DynTestFn(Thunk<'static>),
|
||||
DynMetricFn(Box<for<'a> Invoke<&'a mut MetricMap>+'static>),
|
||||
DynBenchFn(Box<TDynBenchFn+'static>)
|
||||
}
|
||||
@ -878,7 +878,7 @@ pub fn run_test(opts: &TestOpts,
|
||||
fn run_test_inner(desc: TestDesc,
|
||||
monitor_ch: Sender<MonitorMsg>,
|
||||
nocapture: bool,
|
||||
testfn: Thunk) {
|
||||
testfn: Thunk<'static>) {
|
||||
Thread::spawn(move || {
|
||||
let (tx, rx) = channel();
|
||||
let mut reader = ChanReader::new(rx);
|
||||
|
Loading…
x
Reference in New Issue
Block a user