use std::fs::File;
use crate::error::Result;
use crate::op::{CompletionPayload, MadviseAdvice, Op, OpDescriptor};
#[derive(Debug, Clone, Copy)]
pub struct MadviseResult {
pub advice: MadviseAdvice,
}
pub struct Madvise {
file: File,
advice: MadviseAdvice,
}
impl Madvise {
pub fn sequential(file: File) -> Self {
Self {
file,
advice: MadviseAdvice::Sequential,
}
}
pub fn random(file: File) -> Self {
Self {
file,
advice: MadviseAdvice::Random,
}
}
pub fn dont_need(file: File) -> Self {
Self {
file,
advice: MadviseAdvice::DontNeed,
}
}
pub fn normal(file: File) -> Self {
Self {
file,
advice: MadviseAdvice::Normal,
}
}
}
impl Op for Madvise {
type Output = MadviseResult;
fn name(&self) -> &'static str {
"madvise"
}
fn into_descriptor(self) -> Result<OpDescriptor> {
Ok(OpDescriptor::Madvise {
file: self.file,
advice: self.advice,
})
}
fn map_completion(payload: CompletionPayload) -> Result<Self::Output> {
match payload {
CompletionPayload::Bytes(code) => {
let advice = match code {
0 => MadviseAdvice::Sequential,
1 => MadviseAdvice::Random,
2 => MadviseAdvice::DontNeed,
_ => MadviseAdvice::Normal,
};
Ok(MadviseResult { advice })
}
other => Err(crate::error::Error::completion(
format!("madvise received unexpected completion payload: {other:?}"),
"ensure the backend routes madvise completions as byte-count payloads",
)),
}
}
}