use std::io;
use windows_sys::Win32::Storage::FileSystem::{
IORING_CAPABILITIES, IORING_FEATURE_SET_COMPLETION_EVENT, IORING_FEATURE_UM_EMULATION,
IORING_VERSION_1, IORING_VERSION_2, IORING_VERSION_3, QueryIoRingCapabilities,
};
use crate::error::check;
#[derive(Clone, Copy, Debug, PartialEq, Eq, PartialOrd, Ord, Hash)]
pub struct RingVersion(i32);
impl RingVersion {
pub const V1: RingVersion = RingVersion(IORING_VERSION_1);
pub const V2: RingVersion = RingVersion(IORING_VERSION_2);
pub const V3: RingVersion = RingVersion(IORING_VERSION_3);
pub const HIGHEST_KNOWN: RingVersion = Self::V3;
#[must_use]
pub fn from_raw(value: i32) -> Self {
Self(value)
}
#[must_use]
pub fn raw(self) -> i32 {
self.0
}
}
#[derive(Clone, Copy, Debug, PartialEq, Eq)]
pub struct Capabilities {
pub max_version: RingVersion,
pub max_submission_queue_size: u32,
pub max_completion_queue_size: u32,
pub supports_completion_event: bool,
pub is_emulated: bool,
}
pub fn capabilities() -> io::Result<Capabilities> {
let mut raw = IORING_CAPABILITIES::default();
let hr = unsafe { QueryIoRingCapabilities(&raw mut raw) };
check(hr)?;
Ok(decode(&raw))
}
fn decode(raw: &IORING_CAPABILITIES) -> Capabilities {
Capabilities {
max_version: RingVersion(raw.MaxVersion),
max_submission_queue_size: raw.MaxSubmissionQueueSize,
max_completion_queue_size: raw.MaxCompletionQueueSize,
supports_completion_event: raw.FeatureFlags & IORING_FEATURE_SET_COMPLETION_EVENT != 0,
is_emulated: raw.FeatureFlags & IORING_FEATURE_UM_EMULATION != 0,
}
}
#[cfg(test)]
mod tests;