44 lines
1.1 KiB
Rust
44 lines
1.1 KiB
Rust
use {
|
|
crate::{
|
|
copy_device::{CopyDevice, CopyDeviceRegistry},
|
|
utils::errorfmt::ErrorFmt,
|
|
},
|
|
std::{
|
|
cell::OnceCell,
|
|
fmt::{Debug, Formatter},
|
|
rc::Rc,
|
|
},
|
|
uapi::c::dev_t,
|
|
};
|
|
|
|
pub struct CopyDeviceHolder {
|
|
pub registry: Rc<CopyDeviceRegistry>,
|
|
pub devnum: dev_t,
|
|
pub dev: OnceCell<Option<Rc<CopyDevice>>>,
|
|
}
|
|
|
|
impl Debug for CopyDeviceHolder {
|
|
fn fmt(&self, f: &mut Formatter<'_>) -> std::fmt::Result {
|
|
f.debug_struct("CopyDeviceHolder").finish_non_exhaustive()
|
|
}
|
|
}
|
|
|
|
impl CopyDeviceHolder {
|
|
pub fn get(&self) -> Option<Rc<CopyDevice>> {
|
|
self.dev
|
|
.get_or_init(
|
|
|| match self.registry.get(self.devnum)?.create_device().map(Some) {
|
|
Ok(d) => d,
|
|
Err(e) => {
|
|
log::error!(
|
|
"Could not get copy device for {}: {}",
|
|
self.devnum,
|
|
ErrorFmt(e),
|
|
);
|
|
None
|
|
}
|
|
},
|
|
)
|
|
.clone()
|
|
}
|
|
}
|