xref: /DragonOS/tools/debugging/logmonitor/src/backend/monitor/mod.rs (revision 7b32f5080f42bcbf7d2421013f3ea53c776a063c)
1*7b32f508SLoGin use std::{
2*7b32f508SLoGin     fmt::Debug,
3*7b32f508SLoGin     ops::{Deref, DerefMut},
4*7b32f508SLoGin };
5*7b32f508SLoGin 
6*7b32f508SLoGin pub mod logset;
7*7b32f508SLoGin pub mod mm;
8*7b32f508SLoGin 
9*7b32f508SLoGin #[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
10*7b32f508SLoGin pub struct ObjectWrapper<T> {
11*7b32f508SLoGin     object: Box<T>,
12*7b32f508SLoGin }
13*7b32f508SLoGin 
14*7b32f508SLoGin impl<T: Debug + Sized> ObjectWrapper<T> {
new(buf: &[u8]) -> Option<Self>15*7b32f508SLoGin     pub fn new(buf: &[u8]) -> Option<Self> {
16*7b32f508SLoGin         if buf.len() != std::mem::size_of::<T>() {
17*7b32f508SLoGin             println!(
18*7b32f508SLoGin                 "ObjectWrapper::new(): buf.len() '{}'  != std::mem::size_of::<T>(): '{}'",
19*7b32f508SLoGin                 buf.len(),
20*7b32f508SLoGin                 std::mem::size_of::<T>()
21*7b32f508SLoGin             );
22*7b32f508SLoGin             return None;
23*7b32f508SLoGin         }
24*7b32f508SLoGin         let x = unsafe { std::ptr::read(buf.as_ptr() as *const T) };
25*7b32f508SLoGin 
26*7b32f508SLoGin         let object = Box::new(x);
27*7b32f508SLoGin 
28*7b32f508SLoGin         // let object = ManuallyDrop::new(x);
29*7b32f508SLoGin         Some(Self { object })
30*7b32f508SLoGin     }
31*7b32f508SLoGin }
32*7b32f508SLoGin 
33*7b32f508SLoGin impl<T> DerefMut for ObjectWrapper<T> {
deref_mut(&mut self) -> &mut Self::Target34*7b32f508SLoGin     fn deref_mut(&mut self) -> &mut Self::Target {
35*7b32f508SLoGin         &mut self.object
36*7b32f508SLoGin     }
37*7b32f508SLoGin }
38*7b32f508SLoGin 
39*7b32f508SLoGin impl<T> Deref for ObjectWrapper<T> {
40*7b32f508SLoGin     type Target = T;
41*7b32f508SLoGin 
deref(&self) -> &Self::Target42*7b32f508SLoGin     fn deref(&self) -> &Self::Target {
43*7b32f508SLoGin         &self.object
44*7b32f508SLoGin     }
45*7b32f508SLoGin }
46