5 Waker, RawWaker, RawWakerVTable,
8 macro_rules! waker_vtable {
13 wake_by_ref_arc_raw::<$ty>,
20 fn wake(self: Arc<Self>);
22 fn wake_by_ref(arc_self: &Arc<Self>) {
23 arc_self.clone().wake()
26 fn into_waker(wake: Arc<Self>) -> Waker where Self: Sized
28 let ptr = Arc::into_raw(wake) as *const ();
31 Waker::from_raw(RawWaker::new(ptr, waker_vtable!(Self)))
36 unsafe fn increase_refcount<T: ArcWake>(data: *const ()) {
37 // Retain Arc by creating a copy
38 let arc: Arc<T> = Arc::from_raw(data as *const T);
39 let arc_clone = arc.clone();
40 // Forget the Arcs again, so that the refcount isn't decrased
41 let _ = Arc::into_raw(arc);
42 let _ = Arc::into_raw(arc_clone);
45 unsafe fn clone_arc_raw<T: ArcWake>(data: *const ()) -> RawWaker {
46 increase_refcount::<T>(data);
47 RawWaker::new(data, waker_vtable!(T))
50 unsafe fn drop_arc_raw<T: ArcWake>(data: *const ()) {
52 let _: Arc<T> = Arc::from_raw(data as *const T);
55 unsafe fn wake_arc_raw<T: ArcWake>(data: *const ()) {
56 let arc: Arc<T> = Arc::from_raw(data as *const T);
60 unsafe fn wake_by_ref_arc_raw<T: ArcWake>(data: *const ()) {
61 let arc: Arc<T> = Arc::from_raw(data as *const T);
62 ArcWake::wake_by_ref(&arc);
63 let _ = Arc::into_raw(arc);