Skip to main content

dope_core/driver/life/native/create/
mod.rs

1mod failure;
2mod kernel;
3mod mapping;
4
5use dope_sys::{
6    engine::ring::create,
7    io::reactor::{self, ready::store},
8    ring::map::Map,
9};
10pub(crate) use failure::Failure;
11pub(crate) use kernel::Kernel;
12pub(crate) use mapping::Mapping;
13
14use crate::driver::{
15    result,
16    result::{CreateError, IoOperation},
17    storage,
18};
19
20impl From<store::Create> for CreateError {
21    fn from(error: store::Create) -> Self {
22        match error {
23            store::Create::Buffer(error) => CreateError::Buffer(error),
24            store::Create::Allocation(error) => CreateError::Allocation(error),
25            store::Create::Queue(error) => CreateError::Queue(error),
26            store::Create::Reactor(reactor::Create::Open(error)) => {
27                CreateError::kernel(IoOperation::ReactorCreate, Kernel::from(error))
28            }
29            store::Create::Reactor(reactor::Create::Cloexec(error)) => {
30                CreateError::ReactorCloexec(result::Cloexec::Set(error))
31            }
32        }
33    }
34}
35
36impl<S, M, P, C, R> From<create::Failure<S, M, P, C, R>> for CreateError
37where
38    Kernel: From<S>,
39    Mapping: From<Map<M>>,
40    Self: From<P> + From<R>,
41    crate::Resources: From<C>,
42{
43    fn from(error: create::Failure<S, M, P, C, R>) -> Self {
44        match error {
45            create::Failure::Allocation(error) => CreateError::Allocation(error),
46            create::Failure::Setup(error) => {
47                CreateError::kernel(IoOperation::ReactorCreate, Kernel::from(error))
48            }
49            create::Failure::Layout(error) => CreateError::RingLayout(error),
50            create::Failure::Mapping(error) => CreateError::Mapping(Mapping::from(error)),
51            create::Failure::Primary(error) => Self::from(error),
52            create::Failure::Cleanup(state) => CreateError::Cleanup(storage::Cleanup::new(state)),
53            create::Failure::Release(state) => Self::from(state),
54        }
55    }
56}
57
58impl<R, S, C> From<Result<(R, S), C>> for CreateError
59where
60    ((IoOperation, result::Kernel), crate::RemoveSlot): From<(R, S)>,
61    crate::Released: From<C>,
62{
63    fn from(error: Result<(R, S), C>) -> Self {
64        match error.map(Into::into).map(storage::Removal::native) {
65            Ok(primary) => CreateError::Removal(primary),
66            Err(state) => CreateError::Release(storage::Release::new(state)),
67        }
68    }
69}