parallel_processor/execution_manager/
packet.rs1use 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
18impl<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 ) -> 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}