use std::sync::Arc;
use std::time::Duration;
use tokio::sync::mpsc;
use tokio::task;
use rslock::{Lock, LockManager};
#[tokio::main]
async fn main() {
let uris = vec![
"redis://127.0.0.1:6380/",
"redis://127.0.0.1:6381/",
"redis://127.0.0.1:6382/",
];
let lock_manager = Arc::new(LockManager::new(uris));
let (tx, mut rx) = mpsc::channel::<Arc<Lock>>(1);
let sender = {
let lock_manager = Arc::clone(&lock_manager);
task::spawn(async move {
let lock = loop {
match lock_manager
.lock("shared_mutex", Duration::from_millis(2000))
.await
{
Ok(lock) => break Arc::new(lock),
Err(_) => tokio::time::sleep(Duration::from_millis(100)).await, }
};
println!("Sender: Lock acquired.");
if tx.send(lock.clone()).await.is_err() {
println!("Sender: Failed to send the lock.");
return;
}
println!("Sender: Lock sent.");
if lock_manager
.extend(&lock, Duration::from_millis(2000))
.await
.is_ok()
{
println!("Sender: Lock extended.");
} else {
println!("Sender: Failed to extend the lock.");
}
})
};
let receiver = task::spawn(async move {
if let Some(lock) = rx.recv().await {
println!("Receiver: Lock received.");
if lock
.lock_manager
.extend(&lock, Duration::from_millis(1000))
.await
.is_ok()
{
println!("Receiver: Lock extended.");
} else {
println!("Receiver: Failed to extend the lock.");
}
lock.lock_manager.unlock(&lock).await;
println!("Receiver: Lock released.");
} else {
println!("Receiver: No lock received.");
}
});
let _ = tokio::join!(sender, receiver);
}