Move ArcWake in common test file.
This commit is contained in:
parent
363e992b98
commit
8e7ef03141
3 changed files with 73 additions and 110 deletions
|
|
@ -1,7 +1,10 @@
|
|||
// edition:2018
|
||||
// aux-build:arc_wake.rs
|
||||
|
||||
#![feature(arbitrary_self_types, async_await, await_macro, futures_api)]
|
||||
|
||||
extern crate arc_wake;
|
||||
|
||||
use std::pin::Pin;
|
||||
use std::future::Future;
|
||||
use std::sync::{
|
||||
|
|
@ -9,62 +12,9 @@ use std::sync::{
|
|||
atomic::{self, AtomicUsize},
|
||||
};
|
||||
use std::task::{
|
||||
Poll, Waker, RawWaker, RawWakerVTable,
|
||||
Poll, Waker,
|
||||
};
|
||||
|
||||
macro_rules! waker_vtable {
|
||||
($ty:ident) => {
|
||||
&RawWakerVTable {
|
||||
clone: clone_arc_raw::<$ty>,
|
||||
drop: drop_arc_raw::<$ty>,
|
||||
wake: wake_arc_raw::<$ty>,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub trait ArcWake {
|
||||
fn wake(arc_self: &Arc<Self>);
|
||||
|
||||
fn into_waker(wake: Arc<Self>) -> Waker where Self: Sized
|
||||
{
|
||||
let ptr = Arc::into_raw(wake) as *const();
|
||||
|
||||
unsafe {
|
||||
Waker::new_unchecked(RawWaker{
|
||||
data: ptr,
|
||||
vtable: waker_vtable!(Self),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn increase_refcount<T: ArcWake>(data: *const()) {
|
||||
// Retain Arc by creating a copy
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
let arc_clone = arc.clone();
|
||||
// Forget the Arcs again, so that the refcount isn't decrased
|
||||
let _ = Arc::into_raw(arc);
|
||||
let _ = Arc::into_raw(arc_clone);
|
||||
}
|
||||
|
||||
unsafe fn clone_arc_raw<T: ArcWake>(data: *const()) -> RawWaker {
|
||||
increase_refcount::<T>(data);
|
||||
RawWaker {
|
||||
data: data,
|
||||
vtable: waker_vtable!(T),
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn drop_arc_raw<T: ArcWake>(data: *const()) {
|
||||
// Drop Arc
|
||||
let _: Arc<T> = Arc::from_raw(data as *const T);
|
||||
}
|
||||
|
||||
unsafe fn wake_arc_raw<T: ArcWake>(data: *const()) {
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
ArcWake::wake(&arc);
|
||||
let _ = Arc::into_raw(arc);
|
||||
}
|
||||
use arc_wake::ArcWake;
|
||||
|
||||
struct Counter {
|
||||
wakes: AtomicUsize,
|
||||
|
|
|
|||
62
src/test/run-pass/auxiliary/arc_wake.rs
Normal file
62
src/test/run-pass/auxiliary/arc_wake.rs
Normal file
|
|
@ -0,0 +1,62 @@
|
|||
// edition:2018
|
||||
|
||||
#![feature(arbitrary_self_types, futures_api)]
|
||||
|
||||
use std::sync::Arc;
|
||||
use std::task::{
|
||||
Poll, Waker, RawWaker, RawWakerVTable,
|
||||
};
|
||||
|
||||
macro_rules! waker_vtable {
|
||||
($ty:ident) => {
|
||||
&RawWakerVTable {
|
||||
clone: clone_arc_raw::<$ty>,
|
||||
drop: drop_arc_raw::<$ty>,
|
||||
wake: wake_arc_raw::<$ty>,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub trait ArcWake {
|
||||
fn wake(arc_self: &Arc<Self>);
|
||||
|
||||
fn into_waker(wake: Arc<Self>) -> Waker where Self: Sized
|
||||
{
|
||||
let ptr = Arc::into_raw(wake) as *const();
|
||||
|
||||
unsafe {
|
||||
Waker::new_unchecked(RawWaker{
|
||||
data: ptr,
|
||||
vtable: waker_vtable!(Self),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn increase_refcount<T: ArcWake>(data: *const()) {
|
||||
// Retain Arc by creating a copy
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
let arc_clone = arc.clone();
|
||||
// Forget the Arcs again, so that the refcount isn't decrased
|
||||
let _ = Arc::into_raw(arc);
|
||||
let _ = Arc::into_raw(arc_clone);
|
||||
}
|
||||
|
||||
unsafe fn clone_arc_raw<T: ArcWake>(data: *const()) -> RawWaker {
|
||||
increase_refcount::<T>(data);
|
||||
RawWaker {
|
||||
data: data,
|
||||
vtable: waker_vtable!(T),
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn drop_arc_raw<T: ArcWake>(data: *const()) {
|
||||
// Drop Arc
|
||||
let _: Arc<T> = Arc::from_raw(data as *const T);
|
||||
}
|
||||
|
||||
unsafe fn wake_arc_raw<T: ArcWake>(data: *const()) {
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
ArcWake::wake(&arc);
|
||||
let _ = Arc::into_raw(arc);
|
||||
}
|
||||
|
|
@ -1,6 +1,10 @@
|
|||
// aux-build:arc_wake.rs
|
||||
|
||||
#![feature(arbitrary_self_types, futures_api)]
|
||||
#![allow(unused)]
|
||||
|
||||
extern crate arc_wake;
|
||||
|
||||
use std::future::Future;
|
||||
use std::pin::Pin;
|
||||
use std::sync::{
|
||||
|
|
@ -8,62 +12,9 @@ use std::sync::{
|
|||
atomic::{self, AtomicUsize},
|
||||
};
|
||||
use std::task::{
|
||||
Poll, Waker, RawWaker, RawWakerVTable,
|
||||
Poll, Waker,
|
||||
};
|
||||
|
||||
macro_rules! waker_vtable {
|
||||
($ty:ident) => {
|
||||
&RawWakerVTable {
|
||||
clone: clone_arc_raw::<$ty>,
|
||||
drop: drop_arc_raw::<$ty>,
|
||||
wake: wake_arc_raw::<$ty>,
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
pub trait ArcWake {
|
||||
fn wake(arc_self: &Arc<Self>);
|
||||
|
||||
fn into_waker(wake: Arc<Self>) -> Waker where Self: Sized
|
||||
{
|
||||
let ptr = Arc::into_raw(wake) as *const();
|
||||
|
||||
unsafe {
|
||||
Waker::new_unchecked(RawWaker{
|
||||
data: ptr,
|
||||
vtable: waker_vtable!(Self),
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn increase_refcount<T: ArcWake>(data: *const()) {
|
||||
// Retain Arc by creating a copy
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
let arc_clone = arc.clone();
|
||||
// Forget the Arcs again, so that the refcount isn't decrased
|
||||
let _ = Arc::into_raw(arc);
|
||||
let _ = Arc::into_raw(arc_clone);
|
||||
}
|
||||
|
||||
unsafe fn clone_arc_raw<T: ArcWake>(data: *const()) -> RawWaker {
|
||||
increase_refcount::<T>(data);
|
||||
RawWaker {
|
||||
data: data,
|
||||
vtable: waker_vtable!(T),
|
||||
}
|
||||
}
|
||||
|
||||
unsafe fn drop_arc_raw<T: ArcWake>(data: *const()) {
|
||||
// Drop Arc
|
||||
let _: Arc<T> = Arc::from_raw(data as *const T);
|
||||
}
|
||||
|
||||
unsafe fn wake_arc_raw<T: ArcWake>(data: *const()) {
|
||||
let arc: Arc<T> = Arc::from_raw(data as *const T);
|
||||
ArcWake::wake(&arc);
|
||||
let _ = Arc::into_raw(arc);
|
||||
}
|
||||
use arc_wake::ArcWake;
|
||||
|
||||
struct Counter {
|
||||
wakes: AtomicUsize,
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue