#![cfg(feature = "io-uring")]
use crate::io_uring_backend::ops::UringOpRequest;
use fibre::{mpmc::AsyncSender, SendError, TrySendError};
use std::{os::fd::AsRawFd, usize};
#[derive(Clone)] pub struct SignalingOpSender {
op_tx: AsyncSender<UringOpRequest>, event_fd: eventfd::EventFD, }
impl SignalingOpSender {
pub fn new(op_tx: AsyncSender<UringOpRequest>, event_fd: eventfd::EventFD) -> Self {
Self { op_tx, event_fd }
}
pub async fn send(&self, req: UringOpRequest) -> Result<(), SendError> {
let send_result = self.op_tx.send(req).await;
if send_result.is_ok() {
let val_to_write: u64 = 1;
if let Err(e) = self.event_fd.write(val_to_write) {
tracing::error!(
"[SignalingOpSender] Failed to write to eventfd {} after op send: {}. UringWorker might not wake for new op.",
self.event_fd.as_raw_fd(), e
);
} else {
tracing::trace!(
"[SignalingOpSender] Signaled eventfd {} with value {} after op send.",
self.event_fd.as_raw_fd(),
val_to_write
);
}
}
send_result
}
pub fn try_send(&self, req: UringOpRequest) -> Result<(), TrySendError<UringOpRequest>> {
let send_result = self.op_tx.try_send(req);
if send_result.is_ok() {
let val_to_write: u64 = 1;
if let Err(e) = self.event_fd.write(val_to_write) {
tracing::error!(
"[SignalingOpSender] Failed to write to eventfd {} after op try_send: {}. Worker might not wake.",
self.event_fd.as_raw_fd(),
e
);
} else {
tracing::trace!(
"[SignalingOpSender] Signaled eventfd {} with value {} after op try_send.",
self.event_fd.as_raw_fd(),
val_to_write
);
}
}
send_result
}
pub fn is_closed(&self) -> bool {
self.op_tx.is_closed()
}
pub fn is_full(&self) -> bool {
self.op_tx.is_full()
}
pub fn capacity(&self) -> usize {
self.op_tx.capacity().unwrap_or(usize::MAX)
}
pub fn len(&self) -> usize {
self.op_tx.len()
}
}
impl std::fmt::Debug for SignalingOpSender {
fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
f.debug_struct("SignalingOpSender")
.field(
"op_tx_details",
&format_args!(
"AsyncSender(len:{}, cap:{:?}, closed:{})",
self.op_tx.len(),
self.op_tx.capacity(),
self.op_tx.is_closed()
),
)
.field("event_fd_raw", &self.event_fd.as_raw_fd())
.finish()
}
}