diff --git a/src/liballoc/boxed.rs b/src/liballoc/boxed.rs index c794fb8220a9e..ea60c7775af59 100644 --- a/src/liballoc/boxed.rs +++ b/src/liballoc/boxed.rs @@ -66,7 +66,7 @@ use core::marker::{Unpin, Unsize}; use core::mem::{self, PinMut}; use core::ops::{CoerceUnsized, Deref, DerefMut, Generator, GeneratorState}; use core::ptr::{self, NonNull, Unique}; -use core::task::{Context, Poll, UnsafePoll, TaskObj}; +use core::task::{Context, Poll, UnsafeTask, TaskObj}; use core::convert::From; use raw_vec::RawVec; @@ -933,7 +933,7 @@ impl<'a, F: ?Sized + Future> Future for PinBox { } #[unstable(feature = "futures_api", issue = "50547")] -unsafe impl + Send + 'static> UnsafePoll for PinBox { +unsafe impl + Send + 'static> UnsafeTask for PinBox { fn into_raw(self) -> *mut () { PinBox::into_raw(self) as *mut () } @@ -952,13 +952,13 @@ unsafe impl + Send + 'static> UnsafePoll for PinBox { #[unstable(feature = "futures_api", issue = "50547")] impl + Send + 'static> From> for TaskObj { fn from(boxed: PinBox) -> Self { - TaskObj::from_poll_task(boxed) + TaskObj::new(boxed) } } #[unstable(feature = "futures_api", issue = "50547")] impl + Send + 'static> From> for TaskObj { fn from(boxed: Box) -> Self { - TaskObj::from_poll_task(PinBox::from(boxed)) + TaskObj::new(PinBox::from(boxed)) } } diff --git a/src/libcore/task.rs b/src/libcore/task.rs index bef6d3677d0a3..1a6018ffb65ad 100644 --- a/src/libcore/task.rs +++ b/src/libcore/task.rs @@ -16,6 +16,8 @@ use fmt; use ptr::NonNull; +use future::Future; +use mem::PinMut; /// Indicates whether a value is available or if the current task has been /// scheduled to receive a wakeup instead. @@ -455,8 +457,8 @@ pub trait Executor { /// `Box + Send>`. pub struct TaskObj { ptr: *mut (), - poll: unsafe fn(*mut (), &mut Context) -> Poll<()>, - drop: unsafe fn(*mut ()), + poll_fn: unsafe fn(*mut (), &mut Context) -> Poll<()>, + drop_fn: unsafe fn(*mut ()), } impl fmt::Debug for TaskObj { @@ -467,7 +469,6 @@ impl fmt::Debug for TaskObj { } unsafe impl Send for TaskObj {} -unsafe impl Sync for TaskObj {} /// A custom implementation of a task trait object for `TaskObj`, providing /// a hand-rolled vtable. @@ -478,7 +479,7 @@ unsafe impl Sync for TaskObj {} /// The implementor must guarantee that it is safe to call `poll` repeatedly (in /// a non-concurrent fashion) with the result of `into_raw` until `drop` is /// called. -pub unsafe trait UnsafePoll: Send + 'static { +pub unsafe trait UnsafeTask: Send + 'static { /// Convert a owned instance into a (conceptually owned) void pointer. fn into_raw(self) -> *mut (); @@ -504,22 +505,22 @@ pub unsafe trait UnsafePoll: Send + 'static { impl TaskObj { /// Create a `TaskObj` from a custom trait object representation. #[inline] - pub fn from_poll_task(t: T) -> TaskObj { + pub fn new(t: T) -> TaskObj { TaskObj { ptr: t.into_raw(), - poll: T::poll, - drop: T::drop, + poll_fn: T::poll, + drop_fn: T::drop, } } +} + +impl Future for TaskObj { + type Output = (); - /// Poll the task. - /// - /// The semantics here are identical to that for futures, but unlike - /// futures only an `&mut self` reference is needed here. #[inline] - pub fn poll_task(&mut self, cx: &mut Context) -> Poll<()> { + fn poll(self: PinMut, cx: &mut Context) -> Poll<()> { unsafe { - (self.poll)(self.ptr, cx) + (self.poll_fn)(self.ptr, cx) } } } @@ -527,7 +528,7 @@ impl TaskObj { impl Drop for TaskObj { fn drop(&mut self) { unsafe { - (self.drop)(self.ptr) + (self.drop_fn)(self.ptr) } } }