@@ -4,7 +4,7 @@ use core::marker::PhantomData;
44use core:: mem:: { self , ManuallyDrop } ;
55use core:: pin:: Pin ;
66use core:: ptr:: NonNull ;
7- use core:: task:: { Context , Poll } ;
7+ use core:: task:: { Context , Poll , Waker } ;
88
99use crate :: header:: Header ;
1010use crate :: raw:: RawTask ;
@@ -264,6 +264,41 @@ impl<T> Task<T> {
264264 & * raw
265265 }
266266 }
267+
268+ /// Converts this task into a raw pointer to the tag.
269+ pub fn into_raw ( self ) -> * const T {
270+ let offset = Header :: offset_tag :: < T > ( ) ;
271+ let ptr = self . raw_task . as_ptr ( ) ;
272+ mem:: forget ( self ) ;
273+
274+ unsafe { ( ptr as * mut u8 ) . add ( offset) as * const T }
275+ }
276+
277+ /// Converts a raw pointer to the tag into a task.
278+ ///
279+ /// This method should only be used with raw pointers returned from [`into_raw`].
280+ ///
281+ /// [`into_raw`]: #method.into_raw
282+ pub unsafe fn from_raw ( raw : * const T ) -> Task < T > {
283+ let offset = Header :: offset_tag :: < T > ( ) ;
284+ let ptr = ( raw as * mut u8 ) . sub ( offset) as * mut ( ) ;
285+
286+ Task {
287+ raw_task : NonNull :: new_unchecked ( ptr) ,
288+ _marker : PhantomData ,
289+ }
290+ }
291+
292+ /// Returns a waker associated with this task.
293+ pub fn waker ( & self ) -> Waker {
294+ let ptr = self . raw_task . as_ptr ( ) ;
295+ let header = ptr as * const Header ;
296+
297+ unsafe {
298+ let raw_waker = ( ( * header) . vtable . clone_waker ) ( ptr) ;
299+ Waker :: from_raw ( raw_waker)
300+ }
301+ }
267302}
268303
269304impl < T > Drop for Task < T > {
0 commit comments