Skip to content

Commit d458a3d

Browse files
committed
Move waker-related stuff to future module
1 parent 27dc3c4 commit d458a3d

File tree

2 files changed

+43
-37
lines changed

2 files changed

+43
-37
lines changed

rclrs/src/future.rs

Lines changed: 39 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,11 +1,15 @@
11
/// Based on https://www.viget.com/articles/understanding-futures-in-rust-part-1/
2-
use core::marker::PhantomData;
3-
use parking_lot::Mutex;
42
use std::future::Future;
3+
use std::marker::PhantomData;
54
use std::pin::Pin;
65
use std::sync::Arc;
76
use std::task::Context;
87
use std::task::Poll;
8+
use std::task::RawWaker;
9+
use std::task::RawWakerVTable;
10+
use std::task::Waker;
11+
12+
use parking_lot::Mutex;
913

1014
#[derive(Default)]
1115
pub struct RclFuture<T> {
@@ -33,3 +37,36 @@ impl<T: Clone> Future for RclFuture<T> {
3337
}
3438
}
3539
}
40+
41+
#[derive(Clone)]
42+
struct RclWaker {}
43+
44+
fn rclwaker_wake(_s: &RclWaker) {}
45+
46+
fn rclwaker_wake_by_ref(_s: &RclWaker) {}
47+
48+
fn rclwaker_clone(s: &RclWaker) -> RawWaker {
49+
let arc = unsafe { Arc::from_raw(s) };
50+
std::mem::forget(arc.clone());
51+
RawWaker::new(Arc::into_raw(arc) as *const (), &VTABLE)
52+
}
53+
54+
const VTABLE: RawWakerVTable = unsafe {
55+
RawWakerVTable::new(
56+
|s| rclwaker_clone(&*(s as *const RclWaker)),
57+
|s| rclwaker_wake(&*(s as *const RclWaker)),
58+
|s| rclwaker_wake_by_ref(&*(s as *const RclWaker)),
59+
|s| drop(Arc::from_raw(s as *const RclWaker)),
60+
)
61+
};
62+
63+
fn rclwaker_into_waker(s: *const RclWaker) -> Waker {
64+
let raw_waker = RawWaker::new(s as *const (), &VTABLE);
65+
unsafe { Waker::from_raw(raw_waker) }
66+
}
67+
68+
fn create_rcl_waker_context() {
69+
let rclwaker = Arc::new(RclWaker {});
70+
let waker = rclwaker_into_waker(Arc::into_raw(rclwaker));
71+
std::task::Context::from_waker(&waker)
72+
}

rclrs/src/lib.rs

Lines changed: 4 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ pub use wait::*;
2222
use rcl_bindings::rcl_context_is_valid;
2323
use std::time::Duration;
2424

25-
use std::pin::Pin;
26-
2725
pub use rcl_bindings::rmw_request_id_t;
2826

2927
/// Polls the node for new messages and executes the corresponding callbacks.
@@ -107,43 +105,14 @@ pub fn spin(node: &Node) -> Result<(), RclrsError> {
107105
Ok(())
108106
}
109107

110-
#[derive(Clone)]
111-
struct RclWaker {}
112-
113-
fn rclwaker_wake(_s: &RclWaker) {}
114-
115-
fn rclwaker_wake_by_ref(_s: &RclWaker) {}
116-
117-
fn rclwaker_clone(s: &RclWaker) -> RawWaker {
118-
let arc = unsafe { Arc::from_raw(s) };
119-
std::mem::forget(arc.clone());
120-
RawWaker::new(Arc::into_raw(arc) as *const (), &VTABLE)
121-
}
122-
123-
const VTABLE: RawWakerVTable = unsafe {
124-
RawWakerVTable::new(
125-
|s| rclwaker_clone(&*(s as *const RclWaker)),
126-
|s| rclwaker_wake(&*(s as *const RclWaker)),
127-
|s| rclwaker_wake_by_ref(&*(s as *const RclWaker)),
128-
|s| drop(Arc::from_raw(s as *const RclWaker)),
129-
)
130-
};
131-
132-
fn rclwaker_into_waker(s: *const RclWaker) -> Waker {
133-
let raw_waker = RawWaker::new(s as *const (), &VTABLE);
134-
unsafe { Waker::from_raw(raw_waker) }
135-
}
136-
137108
pub fn spin_until_future_complete<T: Unpin + Clone>(
138109
node: &node::Node,
139-
mut future: Arc<Mutex<Box<RclFuture<T>>>>,
140-
) -> Result<<future::RclFuture<T> as Future>::Output, RclReturnCode> {
141-
let rclwaker = Arc::new(RclWaker {});
142-
let waker = rclwaker_into_waker(Arc::into_raw(rclwaker));
143-
let mut cx = std::task::Context::from_waker(&waker);
110+
mut future: Arc<Mutex<Box<crate::future::RclFuture<T>>>>,
111+
) -> Result<<crate::future::RclFuture<T> as Future>::Output, RclReturnCode> {
112+
let mut cx = crate::future::create_rcl_waker_context();
144113

145114
loop {
146-
let context_valid = unsafe { rcl_context_is_valid(&mut *node.context.lock() as *mut _) };
115+
let context_valid = unsafe { rcl_context_is_valid(&mut *node.context.lock()) };
147116
if context_valid {
148117
if let Some(error) = spin_once(node, None).err() {
149118
match error {

0 commit comments

Comments
 (0)