@@ -60,22 +60,6 @@ impl RawWaker {
60
60
RawWaker { data, vtable }
61
61
}
62
62
63
- /// Gets the `data` pointer used to create this `RawWaker`.
64
- #[ inline]
65
- #[ must_use]
66
- #[ unstable( feature = "waker_getters" , issue = "96992" ) ]
67
- pub fn data ( & self ) -> * const ( ) {
68
- self . data
69
- }
70
-
71
- /// Gets the `vtable` pointer used to create this `RawWaker`.
72
- #[ inline]
73
- #[ must_use]
74
- #[ unstable( feature = "waker_getters" , issue = "96992" ) ]
75
- pub fn vtable ( & self ) -> & ' static RawWakerVTable {
76
- self . vtable
77
- }
78
-
79
63
#[ unstable( feature = "noop_waker" , issue = "98286" ) ]
80
64
const NOOP : RawWaker = {
81
65
const VTABLE : RawWakerVTable = RawWakerVTable :: new (
@@ -509,6 +493,37 @@ impl Waker {
509
493
a_data == b_data && ptr:: eq ( a_vtable, b_vtable)
510
494
}
511
495
496
+ /// Creates a new `Waker` from the provided `data` pointer and `vtable`.
497
+ ///
498
+ /// The `data` pointer can be used to store arbitrary data as required
499
+ /// by the executor. This could be e.g. a type-erased pointer to an `Arc`
500
+ /// that is associated with the task.
501
+ /// The value of this pointer will get passed to all functions that are part
502
+ /// of the `vtable` as the first parameter.
503
+ ///
504
+ /// It is important to consider that the `data` pointer must point to a
505
+ /// thread safe type such as an `Arc`.
506
+ ///
507
+ /// The `vtable` customizes the behavior of a `Waker`. For each operation
508
+ /// on the `Waker`, the associated function in the `vtable` will be called.
509
+ ///
510
+ /// # Safety
511
+ ///
512
+ /// The behavior of the returned `Waker` is undefined if the contract defined
513
+ /// in [`RawWakerVTable`]'s documentation is not upheld.
514
+ ///
515
+ /// (Authors wishing to avoid unsafe code may implement the [`Wake`] trait instead, at the
516
+ /// cost of a required heap allocation.)
517
+ ///
518
+ /// [`Wake`]: ../../alloc/task/trait.Wake.html
519
+ #[ inline]
520
+ #[ must_use]
521
+ #[ stable( feature = "waker_getters" , since = "CURRENT_RUSTC_VERSION" ) ]
522
+ #[ rustc_const_stable( feature = "waker_getters" , since = "CURRENT_RUSTC_VERSION" ) ]
523
+ pub const unsafe fn new ( data : * const ( ) , vtable : & ' static RawWakerVTable ) -> Self {
524
+ Waker { waker : RawWaker { data, vtable } }
525
+ }
526
+
512
527
/// Creates a new `Waker` from [`RawWaker`].
513
528
///
514
529
/// # Safety
@@ -565,12 +580,20 @@ impl Waker {
565
580
WAKER
566
581
}
567
582
568
- /// Gets a reference to the underlying [`RawWaker`] .
583
+ /// Gets the `data` pointer used to create this `Waker` .
569
584
#[ inline]
570
585
#[ must_use]
571
- #[ unstable( feature = "waker_getters" , issue = "96992" ) ]
572
- pub fn as_raw ( & self ) -> & RawWaker {
573
- & self . waker
586
+ #[ stable( feature = "waker_getters" , since = "CURRENT_RUSTC_VERSION" ) ]
587
+ pub fn data ( & self ) -> * const ( ) {
588
+ self . waker . data
589
+ }
590
+
591
+ /// Gets the `vtable` pointer used to create this `Waker`.
592
+ #[ inline]
593
+ #[ must_use]
594
+ #[ stable( feature = "waker_getters" , since = "CURRENT_RUSTC_VERSION" ) ]
595
+ pub fn vtable ( & self ) -> & ' static RawWakerVTable {
596
+ self . waker . vtable
574
597
}
575
598
}
576
599
@@ -778,6 +801,30 @@ impl LocalWaker {
778
801
a_data == b_data && ptr:: eq ( a_vtable, b_vtable)
779
802
}
780
803
804
+ /// Creates a new `LocalWaker` from the provided `data` pointer and `vtable`.
805
+ ///
806
+ /// The `data` pointer can be used to store arbitrary data as required
807
+ /// by the executor. This could be e.g. a type-erased pointer to an `Arc`
808
+ /// that is associated with the task.
809
+ /// The value of this pointer will get passed to all functions that are part
810
+ /// of the `vtable` as the first parameter.
811
+ ///
812
+ /// The `vtable` customizes the behavior of a `LocalWaker`. For each
813
+ /// operation on the `LocalWaker`, the associated function in the `vtable`
814
+ /// will be called.
815
+ ///
816
+ /// # Safety
817
+ ///
818
+ /// The behavior of the returned `Waker` is undefined if the contract defined
819
+ /// in [`RawWakerVTable`]'s documentation is not upheld.
820
+ ///
821
+ #[ inline]
822
+ #[ must_use]
823
+ #[ unstable( feature = "local_waker" , issue = "118959" ) ]
824
+ pub const unsafe fn new ( data : * const ( ) , vtable : & ' static RawWakerVTable ) -> Self {
825
+ LocalWaker { waker : RawWaker { data, vtable } }
826
+ }
827
+
781
828
/// Creates a new `LocalWaker` from [`RawWaker`].
782
829
///
783
830
/// The behavior of the returned `LocalWaker` is undefined if the contract defined
@@ -831,12 +878,20 @@ impl LocalWaker {
831
878
WAKER
832
879
}
833
880
834
- /// Gets a reference to the underlying [`RawWaker`] .
881
+ /// Gets the `data` pointer used to create this `LocalWaker` .
835
882
#[ inline]
836
883
#[ must_use]
837
- #[ unstable( feature = "waker_getters" , issue = "96992" ) ]
838
- pub fn as_raw ( & self ) -> & RawWaker {
839
- & self . waker
884
+ #[ unstable( feature = "local_waker" , issue = "118959" ) ]
885
+ pub fn data ( & self ) -> * const ( ) {
886
+ self . waker . data
887
+ }
888
+
889
+ /// Gets the `vtable` pointer used to create this `LocalWaker`.
890
+ #[ inline]
891
+ #[ must_use]
892
+ #[ unstable( feature = "local_waker" , issue = "118959" ) ]
893
+ pub fn vtable ( & self ) -> & ' static RawWakerVTable {
894
+ self . waker . vtable
840
895
}
841
896
}
842
897
#[ unstable( feature = "local_waker" , issue = "118959" ) ]
0 commit comments