dope_core/driver/life/native/create/
mod.rs1mod 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}