pub trait Allocate {
// Required methods
fn index(&self) -> usize;
fn peers(&self) -> usize;
fn allocate<T: Data>(
&mut self,
identifier: usize,
) -> (Vec<Box<dyn Push<Message<T>>>>, Box<dyn Pull<Message<T>>>);
fn events(&self) -> &Rc<RefCell<Vec<usize>>>;
// Provided methods
fn await_events(&self, _duration: Option<Duration>) { ... }
fn receive(&mut self) { ... }
fn release(&mut self) { ... }
fn pipeline<T: 'static>(
&mut self,
identifier: usize,
) -> (ThreadPusher<Message<T>>, ThreadPuller<Message<T>>) { ... }
}
Expand description
A type capable of allocating channels.
There is some feature creep, in that this contains several convenience methods about the nature of the allocated channels, and maintenance methods to ensure that they move records around.
Required Methods§
Sourcefn allocate<T: Data>(
&mut self,
identifier: usize,
) -> (Vec<Box<dyn Push<Message<T>>>>, Box<dyn Pull<Message<T>>>)
fn allocate<T: Data>( &mut self, identifier: usize, ) -> (Vec<Box<dyn Push<Message<T>>>>, Box<dyn Pull<Message<T>>>)
Constructs several send endpoints and one receive endpoint.
Sourcefn events(&self) -> &Rc<RefCell<Vec<usize>>>
fn events(&self) -> &Rc<RefCell<Vec<usize>>>
A shared queue of communication events with channel identifier.
It is expected that users of the channel allocator will regularly drain these events in order to drive their computation. If they fail to do so the event queue may become quite large, and turn into a performance problem.
Provided Methods§
Sourcefn await_events(&self, _duration: Option<Duration>)
fn await_events(&self, _duration: Option<Duration>)
Awaits communication events.
This method may park the current thread, for at most duration
,
until new events arrive.
The method is not guaranteed to wait for any amount of time, but
good implementations should use this as a hint to park the thread.
Sourcefn receive(&mut self)
fn receive(&mut self)
Ensure that received messages are surfaced in each channel.
This method should be called to ensure that received messages are surfaced in each channel, but failing to call the method does not ensure that they are not surfaced.
Generally, this method is the indication that the allocator should present messages contained in otherwise scarce resources (for example network buffers), under the premise that someone is about to consume the messages and release the resources.
Sourcefn release(&mut self)
fn release(&mut self)
Signal the completion of a batch of reads from channels.
Conventionally, this method signals to the communication fabric that the worker is taking a break from reading from channels, and the fabric should consider re-acquiring scarce resources. This can lead to the fabric performing defensive copies out of un-consumed buffers, and can be a performance problem if invoked casually.
Sourcefn pipeline<T: 'static>(
&mut self,
identifier: usize,
) -> (ThreadPusher<Message<T>>, ThreadPuller<Message<T>>)
fn pipeline<T: 'static>( &mut self, identifier: usize, ) -> (ThreadPusher<Message<T>>, ThreadPuller<Message<T>>)
Constructs a pipeline channel from the worker to itself.
By default, this method uses the thread-local channel constructor
based on a shared VecDeque
which updates the event queue.
Dyn Compatibility§
This trait is not dyn compatible.
In older versions of Rust, dyn compatibility was called "object safety", so this trait is not object safe.