1use lever::prelude::*;
2use std::fmt;
3use std::{
4 future::Future,
5 io,
6 ops::{Deref, DerefMut},
7 pin::Pin,
8 sync::Arc,
9};
10
11use crate::syscore::{CompletionChan, StoreFile};
12
13pub type AsyncOp<T> = Pin<Box<dyn Future<Output = io::Result<T>>>>;
16
17pub trait HandleOpRegisterer {
20 fn read_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>>;
21 fn write_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>>;
22}
23
24pub struct Handle<T> {
31 pub(crate) io_task: Option<T>,
33 pub(crate) chan: Option<CompletionChan>,
35 pub(crate) store_file: Option<StoreFile>,
37 pub(crate) read: Arc<TTas<Option<AsyncOp<usize>>>>,
39 pub(crate) write: Arc<TTas<Option<AsyncOp<usize>>>>,
41}
42
43unsafe impl<T> Send for Handle<T> {}
44unsafe impl<T> Sync for Handle<T> {}
45
46impl<T> Handle<T> {
47 pub fn get_ref(&self) -> &T {
48 self.io_task.as_ref().unwrap()
49 }
50
51 pub fn get_mut(&mut self) -> &mut T {
52 self.io_task.as_mut().unwrap()
53 }
54
55 pub fn into_inner(mut self) -> T {
56 self.io_task.take().unwrap()
57 }
58
59 }
66
67impl<T> HandleOpRegisterer for Handle<T> {
68 fn read_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>> {
69 self.read.clone()
70 }
71
72 fn write_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>> {
73 self.write.clone()
74 }
75}
76
77impl<T> HandleOpRegisterer for &Handle<T> {
78 fn read_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>> {
79 self.read.clone()
80 }
81
82 fn write_registerer(&self) -> Arc<TTas<Option<AsyncOp<usize>>>> {
83 self.write.clone()
84 }
85}
86
87impl<T> Deref for Handle<T> {
88 type Target = T;
89
90 fn deref(&self) -> &Self::Target {
91 self.io_task.as_ref().unwrap()
92 }
93}
94
95impl<T> DerefMut for Handle<T> {
96 fn deref_mut(&mut self) -> &mut Self::Target {
97 self.io_task.as_mut().unwrap()
98 }
99}
100
101impl<T: fmt::Debug> fmt::Debug for Handle<T> {
102 fn fmt(&self, f: &mut std::fmt::Formatter<'_>) -> std::fmt::Result {
103 f.debug_struct("Handle")
104 .field("io_task", self.io_task.as_ref().unwrap())
105 .finish()
106 }
107}