use crate::cmux::CmuxSession;
use crate::port::tx_queue::PortTxQueue;
use std::sync::atomic::{AtomicBool, Ordering};
use std::sync::Arc;
pub fn cancel_physical_exchange(
exchange_cancel: &AtomicBool,
tx_queue: &PortTxQueue,
hub_cancel: impl FnOnce(),
) {
exchange_cancel.store(true, Ordering::SeqCst);
hub_cancel();
tx_queue.cancel_all();
tx_queue.clear_halt();
}
pub fn cancel_virtual_exchange(
exchange_cancel: &AtomicBool,
tx_queue: &PortTxQueue,
session: &CmuxSession,
dlci: u8,
) {
exchange_cancel.store(true, Ordering::SeqCst);
session.cancel_active_exchange(dlci);
tx_queue.cancel_all();
tx_queue.clear_halt();
}
pub type HubCancelFn = Box<dyn FnOnce() + Send>;
pub fn cancel_physical_exchange_optional(
exchange_cancel: &Arc<AtomicBool>,
tx_queue: &Arc<PortTxQueue>,
hub_cancel: Option<HubCancelFn>,
) {
exchange_cancel.store(true, Ordering::SeqCst);
if let Some(cancel) = hub_cancel {
cancel();
}
tx_queue.cancel_all();
tx_queue.clear_halt();
}