Skip to content

Commit bc88283

Browse files
committed
Update spin* to take an Arc
1 parent 39e9edd commit bc88283

File tree

8 files changed

+19
-16
lines changed

8 files changed

+19
-16
lines changed

docs/writing-your-first-rclrs-node.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -76,7 +76,7 @@ Next, add a main function to launch it:
7676
fn main() -> Result<(), rclrs::RclrsError> {
7777
let context = rclrs::Context::new(std::env::args())?;
7878
let republisher = RepublisherNode::new(&context)?;
79-
rclrs::spin(&republisher.node)
79+
rclrs::spin(republisher.node)
8080
}
8181
```
8282

@@ -190,7 +190,7 @@ fn main() -> Result<(), rclrs::RclrsError> {
190190
republisher.republish()?;
191191
}
192192
});
193-
rclrs::spin(&republisher.node)
193+
rclrs::spin(republisher.node)
194194
}
195195
```
196196

@@ -212,7 +212,7 @@ fn main() -> Result<(), rclrs::RclrsError> {
212212
republisher_other_thread.republish()?;
213213
}
214214
});
215-
rclrs::spin(&republisher.node)
215+
rclrs::spin(republisher.node)
216216
}
217217
```
218218

examples/message_demo/src/message_demo.rs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
use std::convert::TryInto;
22
use std::env;
3+
use std::sync::Arc;
34

45
use anyhow::{Error, Result};
56
use rosidl_runtime_rs::{seq, BoundedSequence, Message, Sequence};
@@ -159,10 +160,10 @@ fn demonstrate_pubsub() -> Result<(), Error> {
159160
)?;
160161
println!("Sending idiomatic message.");
161162
idiomatic_publisher.publish(rclrs_example_msgs::msg::VariousTypes::default())?;
162-
rclrs::spin_once(&node, None)?;
163+
rclrs::spin_once(Arc::clone(&node), None)?;
163164
println!("Sending RMW-native message.");
164165
direct_publisher.publish(rclrs_example_msgs::msg::rmw::VariousTypes::default())?;
165-
rclrs::spin_once(&node, None)?;
166+
rclrs::spin_once(Arc::clone(&node), None)?;
166167

167168
Ok(())
168169
}

examples/minimal_client_service/src/minimal_client.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -28,5 +28,5 @@ fn main() -> Result<(), Error> {
2828
std::thread::sleep(std::time::Duration::from_millis(500));
2929

3030
println!("Waiting for response");
31-
rclrs::spin(&node).map_err(|err| err.into())
31+
rclrs::spin(node).map_err(|err| err.into())
3232
}

examples/minimal_client_service/src/minimal_client_async.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,7 @@ async fn main() -> Result<(), Error> {
2020

2121
println!("Waiting for response");
2222

23-
let rclrs_spin = tokio::task::spawn_blocking(move || rclrs::spin(&node));
23+
let rclrs_spin = tokio::task::spawn_blocking(move || rclrs::spin(node));
2424

2525
let response = future.await?;
2626
println!(

examples/minimal_client_service/src/minimal_service.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -21,5 +21,5 @@ fn main() -> Result<(), Error> {
2121
.create_service::<example_interfaces::srv::AddTwoInts, _>("add_two_ints", handle_service)?;
2222

2323
println!("Starting server");
24-
rclrs::spin(&node).map_err(|err| err.into())
24+
rclrs::spin(node).map_err(|err| err.into())
2525
}

examples/minimal_pub_sub/src/minimal_subscriber.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ fn main() -> Result<(), Error> {
1919
},
2020
)?;
2121

22-
rclrs::spin(&node).map_err(|err| err.into())
22+
rclrs::spin(node).map_err(|err| err.into())
2323
}

examples/minimal_pub_sub/src/zero_copy_subscriber.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,5 +19,5 @@ fn main() -> Result<(), Error> {
1919
},
2020
)?;
2121

22-
rclrs::spin(&node).map_err(|err| err.into())
22+
rclrs::spin(node).map_err(|err| err.into())
2323
}

rclrs/src/lib.rs

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -50,8 +50,8 @@ pub use wait::*;
5050
/// This can usually be ignored.
5151
///
5252
/// [1]: crate::RclReturnCode
53-
pub fn spin_once(node: &Node, timeout: Option<Duration>) -> Result<(), RclrsError> {
54-
let wait_set = WaitSet::new_for_node(node)?;
53+
pub fn spin_once(node: Arc<Node>, timeout: Option<Duration>) -> Result<(), RclrsError> {
54+
let wait_set = WaitSet::new_for_node(&*node)?;
5555
let ready_entities = wait_set.wait(timeout)?;
5656

5757
for ready_subscription in ready_entities.subscriptions {
@@ -72,19 +72,21 @@ pub fn spin_once(node: &Node, timeout: Option<Duration>) -> Result<(), RclrsErro
7272
/// Convenience function for calling [`spin_once`] in a loop.
7373
///
7474
/// This function additionally checks that the context is still valid.
75-
pub fn spin(node: &Node) -> Result<(), RclrsError> {
75+
pub fn spin(node: Arc<Node>) -> Result<(), RclrsError> {
7676
// The context_is_valid functions exists only to abstract away ROS distro differences
7777
#[cfg(ros_distro = "foxy")]
7878
// SAFETY: No preconditions for this function.
7979
let context_is_valid =
8080
|| unsafe { rcl_context_is_valid(&mut *node.rcl_context_mtx.lock().unwrap()) };
8181
#[cfg(not(ros_distro = "foxy"))]
8282
// SAFETY: No preconditions for this function.
83-
let context_is_valid =
84-
|| unsafe { rcl_context_is_valid(&*node.rcl_context_mtx.lock().unwrap()) };
83+
let context_is_valid = {
84+
let node = Arc::clone(&node);
85+
move || unsafe { rcl_context_is_valid(&*node.rcl_context_mtx.lock().unwrap()) }
86+
};
8587

8688
while context_is_valid() {
87-
match spin_once(node, None) {
89+
match spin_once(Arc::clone(&node), None) {
8890
Ok(_)
8991
| Err(RclrsError::RclError {
9092
code: RclReturnCode::Timeout,

0 commit comments

Comments
 (0)