mirror of
https://github.com/rtic-rs/rtic.git
synced 2025-12-16 21:05:35 +01:00
rtic-sync: add loom tests
This commit is contained in:
parent
b5db435501
commit
cf2ed6d49e
1 changed files with 54 additions and 0 deletions
|
|
@ -836,3 +836,57 @@ mod tokio_tests {
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#[cfg(test)]
|
||||
#[cfg(loom)]
|
||||
mod loom_test {
|
||||
use cassette::Cassette;
|
||||
use loom::thread;
|
||||
|
||||
#[macro_export]
|
||||
#[allow(missing_docs)]
|
||||
macro_rules! make_loom_channel {
|
||||
($type:ty, $size:expr) => {{
|
||||
let channel: crate::channel::Channel<$type, $size> = super::Channel::new();
|
||||
let boxed = Box::new(channel);
|
||||
let boxed = Box::leak(boxed);
|
||||
|
||||
// SAFETY: This is safe as we hide the static mut from others to access it.
|
||||
// Only this point is where the mutable access happens.
|
||||
boxed.split()
|
||||
}};
|
||||
}
|
||||
|
||||
// This test tests the following scenarios:
|
||||
// 1. Receiver is dropped while concurrent senders are waiting to send.
|
||||
// 2. Concurrent senders are competing for the same free slot.
|
||||
#[test]
|
||||
pub fn concurrent_send_while_full_and_drop() {
|
||||
loom::model(|| {
|
||||
let (mut tx, mut rx) = make_loom_channel!([u8; 20], 1);
|
||||
let mut cloned = tx.clone();
|
||||
|
||||
tx.try_send([1; 20]).unwrap();
|
||||
|
||||
let handle1 = thread::spawn(move || {
|
||||
let future = std::pin::pin!(tx.send([1; 20]));
|
||||
let mut future = Cassette::new(future);
|
||||
if future.poll_on().is_none() {
|
||||
future.poll_on();
|
||||
}
|
||||
});
|
||||
|
||||
rx.try_recv().ok();
|
||||
|
||||
let future = std::pin::pin!(cloned.send([1; 20]));
|
||||
let mut future = Cassette::new(future);
|
||||
if future.poll_on().is_none() {
|
||||
future.poll_on();
|
||||
}
|
||||
|
||||
drop(rx);
|
||||
|
||||
handle1.join().unwrap();
|
||||
});
|
||||
}
|
||||
}
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue