#![cfg_attr(not(feature = "std"), no_std)]
#![warn(missing_docs)]
#![forbid(unsafe_code)]
extern crate alloc;
mod factory;
mod participant;
mod publisher;
mod reader;
mod subscriber;
mod writer;
pub use factory::AsyncDomainParticipantFactory;
pub use participant::AsyncDomainParticipant;
pub use publisher::AsyncPublisher;
pub use reader::{AsyncDataReader, DataAvailableStream, PublicationMatchedStream, SampleStream};
pub use subscriber::AsyncSubscriber;
pub use writer::AsyncDataWriter;
pub use zerodds_dcps::status::SubscriptionMatchedStatus;
pub use zerodds_dcps::{
DataReaderQos, DataWriterQos, DdsError, DdsType, DomainParticipantQos, InstanceHandle,
PublisherQos, Result, SubscriberQos, Topic, TopicQos,
};
#[cfg(feature = "std")]
pub(crate) async fn yield_for(d: core::time::Duration) {
#[cfg(feature = "tokio-glue")]
{
tokio::time::sleep(d).await;
}
#[cfg(not(feature = "tokio-glue"))]
{
SleepFuture::new(d).await
}
}
#[cfg(all(feature = "std", not(feature = "tokio-glue")))]
struct SleepFuture {
deadline: std::time::Instant,
spawned: bool,
}
#[cfg(all(feature = "std", not(feature = "tokio-glue")))]
impl SleepFuture {
fn new(d: core::time::Duration) -> Self {
Self {
deadline: std::time::Instant::now() + d,
spawned: false,
}
}
}
#[cfg(all(feature = "std", not(feature = "tokio-glue")))]
impl core::future::Future for SleepFuture {
type Output = ();
fn poll(
mut self: core::pin::Pin<&mut Self>,
cx: &mut core::task::Context<'_>,
) -> core::task::Poll<()> {
if std::time::Instant::now() >= self.deadline {
return core::task::Poll::Ready(());
}
if !self.spawned {
self.spawned = true;
let waker = cx.waker().clone();
let deadline = self.deadline;
std::thread::spawn(move || {
let now = std::time::Instant::now();
if deadline > now {
std::thread::sleep(deadline - now);
}
waker.wake();
});
}
core::task::Poll::Pending
}
}