parallel_processor/execution_manager/
packet.rs

1use crate::execution_manager::objects_pool::{ObjectsPool, PoolObject, PoolObjectTrait};
2use std::cell::UnsafeCell;
3use std::ops::{Deref, DerefMut};
4
5pub trait PacketTrait: PoolObjectTrait + Sync + Send {
6    fn get_size(&self) -> usize;
7}
8
9pub struct Packet<T: PoolObjectTrait> {
10    object: PoolObject<Box<T>>,
11    _not_sync: std::marker::PhantomData<UnsafeCell<()>>,
12}
13
14pub struct PacketsPool<T: Sync + Send + 'static> {
15    objects_pool: ObjectsPool<Box<T>>,
16}
17
18// Recursively implement the object trait for the pool, so it can be used recursively
19impl<T: PoolObjectTrait> PoolObjectTrait for PacketsPool<T> {
20    type InitData = (usize, T::InitData);
21
22    fn allocate_new((cap, init_data): &Self::InitData) -> Self {
23        Self::new(*cap, init_data.clone())
24    }
25
26    fn reset(&mut self) {}
27}
28
29impl<T: PoolObjectTrait> PacketsPool<T> {
30    pub fn new(
31        cache_size: usize,
32        init_data: T::InitData,
33        // mem_tracker: &Arc<MemoryTrackerManager>,
34    ) -> Self {
35        let objects_pool = ObjectsPool::new(cache_size, init_data);
36        Self { objects_pool }
37    }
38
39    pub fn alloc_packet(&self) -> Packet<T> {
40        let object = self.objects_pool.alloc_object();
41
42        Packet {
43            object,
44            _not_sync: std::marker::PhantomData,
45        }
46    }
47}
48
49impl<T: PoolObjectTrait> Packet<T> {
50    pub fn new_simple(data: T) -> Self {
51        Packet {
52            object: PoolObject::new_simple(Box::new(data)),
53            _not_sync: std::marker::PhantomData,
54        }
55    }
56}
57
58impl<T: PoolObjectTrait> Deref for Packet<T> {
59    type Target = T;
60    #[inline(always)]
61    fn deref(&self) -> &Self::Target {
62        self.object.deref()
63    }
64}
65
66impl<T: PoolObjectTrait> DerefMut for Packet<T> {
67    #[inline(always)]
68    fn deref_mut(&mut self) -> &mut Self::Target {
69        self.object.deref_mut()
70    }
71}
72
73impl PoolObjectTrait for () {
74    type InitData = ();
75    fn allocate_new(_init_data: &Self::InitData) -> Self {
76        panic!("Cannot create () type as object!");
77    }
78
79    fn reset(&mut self) {
80        panic!("Cannot reset () type as object!");
81    }
82}
83impl PacketTrait for () {
84    fn get_size(&self) -> usize {
85        0
86    }
87}