1extern crate lossyq;
2extern crate libc;
3
4pub mod scheduler;
5pub mod elem;
6
7pub use lossyq::spsc::{Sender,Receiver};
9pub use elem::{source, sink, filter, scatter, gather, ymerge, ysplit, connectable};
10pub use scheduler::Scheduler;
11
12#[derive(Copy, Clone, Debug)]
13pub enum ChannelState {
14 ReceiverNotConnected,
15 ConnectedReceiver,
16 SenderNotConnected,
17 ConnectedSender,
18}
19
20#[derive(Copy, Clone, Debug)]
21pub struct ExpectedChannelState (pub ChannelState);
22
23#[derive(Copy, Clone, Debug)]
24pub struct ActualChannelState (pub ChannelState);
25
26#[derive(Copy, Clone, Debug)]
27pub enum Error {
28 Busy,
29 NonExistent,
30 Stopping,
31 AlreadyExists,
32 InvalidChannelState(ExpectedChannelState, ActualChannelState)
33}
34
35#[derive(Copy,Clone,Debug,PartialEq,Eq)]
36pub struct InclusiveMessageRange {
37 pub from: usize,
38 pub to: usize,
39}
40
41#[derive(Copy,Clone,Debug,PartialEq,Eq)]
42pub struct ChannelPosition (pub usize);
43
44#[derive(Copy, Clone,Debug)]
45pub enum Message<ValueType: Send, ErrorType: Send> {
46 Value(ValueType),
47 Ack(InclusiveMessageRange),
48 Error(ChannelPosition, ErrorType),
49}
50
51#[derive(Copy,Clone,Debug,PartialEq,Eq)]
52pub struct SenderChannelId (pub usize);
53
54#[derive(Copy,Clone,Debug,PartialEq,Eq)]
55pub struct ReceiverChannelId (pub usize);
56
57#[derive(Copy,Clone,Debug,PartialEq,Eq)]
58pub struct ChannelId {
59 pub sender_id: SenderChannelId,
60 pub receiver_id: ReceiverChannelId,
61}
62
63#[derive(Copy,Clone,Debug,PartialEq,Eq)]
64pub struct PeriodLengthInUsec (pub usize);
65
66#[derive(Copy,Clone,Debug)]
67pub enum SchedulingRule {
68 Loop,
69 OnMessage,
70 Periodic(PeriodLengthInUsec),
71 OnExternalEvent,
72}
73
74#[derive(Copy,Clone,Debug,PartialEq,Eq,Hash)]
75pub struct TaskId (usize);
76
77
78#[derive(Clone,Debug,PartialEq,Eq)]
79pub struct SenderName (pub String);
80
81#[derive(Clone,Debug,PartialEq,Eq)]
82pub struct ReceiverName (pub String);
83
84pub trait Task {
85 fn execute(&mut self, stop: &mut bool);
86 fn name(&self) -> &String;
87 fn input_count(&self) -> usize;
88 fn output_count(&self) -> usize;
89 fn input_id(&self, ch_id: ReceiverChannelId) -> Option<(ChannelId, SenderName)>;
90 fn input_channel_pos(&self, ch_id: ReceiverChannelId) -> ChannelPosition;
91 fn output_channel_pos(&self, ch_id: SenderChannelId) -> ChannelPosition;
92}
93
94pub enum ChannelWrapper<Value: Send, Error: Send> {
95 ReceiverNotConnected(ReceiverChannelId, ReceiverName),
96 ConnectedReceiver(ChannelId, Receiver<Message<Value, Error>>, SenderName),
97 SenderNotConnected(SenderChannelId, Receiver<Message<Value, Error>>, SenderName),
98 ConnectedSender(ChannelId, ReceiverName),
99}
100
101#[cfg(test)]
102pub mod tests;
103
104#[cfg(any(test, feature = "bench"))]
105pub mod sample;
106
107#[cfg(any(test, feature = "bench"))]
108pub mod bench;