dd_sds/scanner/
shared_pool.rs1use std::ops::DerefMut;
2
3use regex_automata_fork::util::pool::{Pool, PoolGuard};
4
5type CachePoolFn<T> = Box<dyn Fn() -> T + Send + Sync>;
6pub type SharedPoolGuard<'a, T, const MAX_POOL_STACKS: usize> =
7 PoolGuard<'a, T, CachePoolFn<T>, MAX_POOL_STACKS>;
8
9pub struct SharedPool<T> {
11 pool: Box<dyn AutoStacksSizePool<T>>,
12}
13
14pub trait AutoStacksSizePool<T>: Sync + Send {
16 fn get(&self) -> Box<dyn AutoStacksSizeGuard<T> + '_>;
17}
18
19pub trait AutoStacksSizeGuard<T> {
20 fn get_ref(&mut self) -> &mut T;
21}
22
23impl<T: Send, const MAX_POOL_STACKS: usize> AutoStacksSizeGuard<T>
24 for PoolGuard<'_, T, CachePoolFn<T>, MAX_POOL_STACKS>
25{
26 fn get_ref(&mut self) -> &mut T {
27 self.deref_mut()
28 }
29}
30
31impl<T: Send, const MAX_POOL_STACKS: usize> AutoStacksSizePool<T>
32 for Pool<T, CachePoolFn<T>, MAX_POOL_STACKS>
33{
34 fn get(&self) -> Box<dyn AutoStacksSizeGuard<T> + '_> {
35 Box::new(Pool::get(self))
36 }
37}
38
39impl<T: Send + 'static> SharedPool<T> {
40 pub fn new(factory: CachePoolFn<T>, count: usize) -> Self {
54 let pool = if count <= 4 {
55 Box::new(Pool::<_, _, 4>::new(factory)) as Box<dyn AutoStacksSizePool<T>>
56 } else if count <= 8 {
57 Box::new(Pool::<_, _, 8>::new(factory)) as Box<dyn AutoStacksSizePool<T>>
58 } else if count <= 16 {
59 Box::new(Pool::<_, _, 16>::new(factory)) as Box<dyn AutoStacksSizePool<T>>
60 } else if count <= 32 {
61 Box::new(Pool::<_, _, 32>::new(factory)) as Box<dyn AutoStacksSizePool<T>>
62 } else {
63 Box::new(Pool::<_, _, 64>::new(factory)) as Box<dyn AutoStacksSizePool<T>>
64 };
65 Self { pool }
66 }
67
68 pub fn get(&self) -> Box<dyn AutoStacksSizeGuard<T> + '_> {
69 self.pool.get()
70 }
71}