Skip to content

Commit

Permalink
Update the libraries to reflect Send loosing the 'static bound.
Browse files Browse the repository at this point in the history
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.
  • Loading branch information
huonw committed Feb 17, 2015
1 parent cae969e commit d7b5bc3
Show file tree
Hide file tree
Showing 20 changed files with 83 additions and 81 deletions.
4 changes: 2 additions & 2 deletions src/libstd/rt/at_exit_imp.rs
Expand Up @@ -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
Expand Down Expand Up @@ -65,7 +65,7 @@ pub fn cleanup() {
}
}

pub fn push(f: Thunk) {
pub fn push(f: Thunk<'static>) {
unsafe {
LOCK.lock();
init();
Expand Down
2 changes: 1 addition & 1 deletion src/libstd/rt/mod.rs
Expand Up @@ -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));
}

Expand Down
4 changes: 2 additions & 2 deletions src/libstd/rt/unwind.rs
Expand Up @@ -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);
Expand Down Expand Up @@ -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 {
Expand Down
8 changes: 4 additions & 4 deletions src/libstd/sync/future.rs
Expand Up @@ -46,7 +46,7 @@ pub struct Future<A> {
}

enum FutureState<A> {
Pending(Thunk<(),A>),
Pending(Thunk<'static,(),A>),
Evaluating,
Forced(A)
}
Expand Down Expand Up @@ -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.
Expand All @@ -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
Expand All @@ -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.
Expand Down
30 changes: 15 additions & 15 deletions src/libstd/sync/mpsc/mod.rs
Expand Up @@ -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
Expand All @@ -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.
Expand All @@ -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> {}

Expand Down Expand Up @@ -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)))
}
Expand Down Expand Up @@ -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)))
}
Expand All @@ -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),
Expand Down Expand Up @@ -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) => {
Expand Down Expand Up @@ -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(); },
Expand All @@ -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 }
}
Expand Down Expand Up @@ -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());
Expand All @@ -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(); }
}
Expand All @@ -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) }
}
Expand Down Expand Up @@ -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() } {
Expand Down Expand Up @@ -942,15 +942,15 @@ 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() }
}

#[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(); },
Expand Down
6 changes: 3 additions & 3 deletions src/libstd/sync/mpsc/mpsc_queue.rs
Expand Up @@ -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> {
Expand All @@ -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> {
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/sync/mpsc/oneshot.rs
Expand Up @@ -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,
Expand Down Expand Up @@ -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);
}
Expand Down
6 changes: 3 additions & 3 deletions src/libstd/sync/mpsc/select.rs
Expand Up @@ -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 {
Expand Down Expand Up @@ -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 }
Expand Down Expand Up @@ -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() }
}
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/sync/mpsc/shared.rs
Expand Up @@ -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> {
Expand Down Expand Up @@ -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
Expand Down
10 changes: 5 additions & 5 deletions src/libstd/sync/mpsc/spsc_queue.rs
Expand Up @@ -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 {
Expand All @@ -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
Expand Down Expand Up @@ -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();
Expand Down
4 changes: 2 additions & 2 deletions src/libstd/sync/mpsc/stream.rs
Expand Up @@ -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) },
Expand Down Expand Up @@ -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
Expand Down

0 comments on commit d7b5bc3

Please sign in to comment.