use super::*;
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum XferOp {
Read = 0,
Write = 1,
}
#[repr(C)]
#[derive(Debug, Copy, Clone, PartialEq)]
pub enum CostMethod {
AnalyticalBackend = 0,
Unknown = 1,
}
impl From<u32> for CostMethod {
fn from(value: u32) -> Self {
match value {
0 => CostMethod::AnalyticalBackend,
_ => CostMethod::Unknown,
}
}
}
pub struct XferRequest {
inner: NonNull<bindings::nixl_capi_xfer_req_s>,
agent: Arc<RwLock<AgentInner>>,
}
impl XferRequest {
pub(crate) fn new(
inner: NonNull<bindings::nixl_capi_xfer_req_s>,
agent: Arc<RwLock<AgentInner>>,
) -> Self {
Self { inner, agent }
}
pub(crate) fn handle(&self) -> *mut bindings::nixl_capi_xfer_req_s {
self.inner.as_ptr()
}
pub fn get_telemetry(&self) -> Result<XferTelemetry, NixlError> {
tracing::trace!("Getting transfer telemetry from request");
let mut telemetry = bindings::nixl_capi_xfer_telemetry_s {
start_time_us: 0,
post_duration_us: 0,
xfer_duration_us: 0,
total_bytes: 0,
desc_count: 0,
};
let status = unsafe {
nixl_capi_get_xfer_telemetry(
self.agent.write().unwrap().handle.as_ptr(),
self.handle(),
&mut telemetry,
)
};
match status {
NIXL_CAPI_SUCCESS => {
tracing::trace!("Successfully retrieved transfer telemetry from request");
Ok(XferTelemetry {
start_time_us: telemetry.start_time_us,
post_duration_us: telemetry.post_duration_us,
xfer_duration_us: telemetry.xfer_duration_us,
total_bytes: telemetry.total_bytes,
desc_count: telemetry.desc_count,
})
},
NIXL_CAPI_IN_PROG => {
tracing::error!(error = "transfer_not_complete", "Transfer not complete");
Err(NixlError::NoTelemetry)
},
NIXL_CAPI_ERROR_NO_TELEMETRY => {
tracing::error!(error = "telemetry_not_enabled", "Telemetry not enabled");
Err(NixlError::NoTelemetry)
},
_ => {
tracing::error!(error = "backend_error", "Failed to get transfer telemetry from request");
Err(NixlError::BackendError)
}
}
}
}
unsafe impl Send for XferRequest {}
unsafe impl Sync for XferRequest {}
impl Drop for XferRequest {
fn drop(&mut self) {
unsafe {
bindings::nixl_capi_release_xfer_req(
self.agent.write().unwrap().handle.as_ptr(),
self.inner.as_ptr(),
);
bindings::nixl_capi_destroy_xfer_req(self.inner.as_ptr());
}
}
}