timely_communication/allocator/
counters.rs1use std::rc::Rc;
4use std::cell::RefCell;
5use std::collections::VecDeque;
6
7use crate::{Push, Pull};
8use crate::allocator::Event;
9
10pub struct Pusher<T, P: Push<T>> {
12 index: usize,
13 events: Rc<RefCell<VecDeque<(usize, Event)>>>,
15 pusher: P,
16 phantom: ::std::marker::PhantomData<T>,
17}
18
19impl<T, P: Push<T>> Pusher<T, P> {
20 pub fn new(pusher: P, index: usize, events: Rc<RefCell<VecDeque<(usize, Event)>>>) -> Self {
22 Pusher {
23 index,
24 events,
26 pusher,
27 phantom: ::std::marker::PhantomData,
28 }
29 }
30}
31
32impl<T, P: Push<T>> Push<T> for Pusher<T, P> {
33 #[inline]
34 fn push(&mut self, element: &mut Option<T>) {
35 self.events
49 .borrow_mut()
50 .push_back((self.index, Event::Pushed(1)));
51
52 self.pusher.push(element)
53 }
54}
55
56use crossbeam_channel::Sender;
57
58pub struct ArcPusher<T, P: Push<T>> {
60 index: usize,
61 events: Sender<(usize, Event)>,
63 pusher: P,
64 phantom: ::std::marker::PhantomData<T>,
65 buzzer: crate::buzzer::Buzzer,
66}
67
68impl<T, P: Push<T>> ArcPusher<T, P> {
69 pub fn new(pusher: P, index: usize, events: Sender<(usize, Event)>, buzzer: crate::buzzer::Buzzer) -> Self {
71 ArcPusher {
72 index,
73 events,
75 pusher,
76 phantom: ::std::marker::PhantomData,
77 buzzer,
78 }
79 }
80}
81
82impl<T, P: Push<T>> Push<T> for ArcPusher<T, P> {
83 #[inline]
84 fn push(&mut self, element: &mut Option<T>) {
85 self.pusher.push(element);
102 let _ = self.events.send((self.index, Event::Pushed(1)));
103 self.buzzer.buzz();
106 }
107}
108
109pub struct Puller<T, P: Pull<T>> {
111 index: usize,
112 count: usize,
113 events: Rc<RefCell<VecDeque<(usize, Event)>>>,
114 puller: P,
115 phantom: ::std::marker::PhantomData<T>,
116}
117
118impl<T, P: Pull<T>> Puller<T, P> {
119 pub fn new(puller: P, index: usize, events: Rc<RefCell<VecDeque<(usize, Event)>>>) -> Self {
121 Puller {
122 index,
123 count: 0,
124 events,
125 puller,
126 phantom: ::std::marker::PhantomData,
127 }
128 }
129}
130impl<T, P: Pull<T>> Pull<T> for Puller<T, P> {
131 #[inline]
132 fn pull(&mut self) -> &mut Option<T> {
133 let result = self.puller.pull();
134 if result.is_none() {
135 if self.count != 0 {
136 self.events
137 .borrow_mut()
138 .push_back((self.index, Event::Pulled(self.count)));
139 self.count = 0;
140 }
141 }
142 else {
143 self.count += 1;
144 }
145
146 result
147 }
148}