@@ -4,7 +4,7 @@ use core::marker::PhantomData;
4
4
use core:: mem:: { self , ManuallyDrop } ;
5
5
use core:: pin:: Pin ;
6
6
use core:: ptr:: NonNull ;
7
- use core:: task:: { Context , Poll } ;
7
+ use core:: task:: { Context , Poll , Waker } ;
8
8
9
9
use crate :: header:: Header ;
10
10
use crate :: raw:: RawTask ;
@@ -264,6 +264,41 @@ impl<T> Task<T> {
264
264
& * raw
265
265
}
266
266
}
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
+ }
267
302
}
268
303
269
304
impl < T > Drop for Task < T > {
0 commit comments