1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
use api::{Epoch, PipelineId};
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use std::io::{Cursor, Read};
use std::mem;
use std::sync::mpsc::Receiver;
#[derive(Clone)]
pub struct Payload {
pub epoch: Epoch,
pub pipeline_id: PipelineId,
pub display_list_data: Vec<u8>,
}
impl Payload {
pub fn construct_data(epoch: Epoch, pipeline_id: PipelineId, dl_data: &[u8]) -> Vec<u8> {
let mut data = Vec::with_capacity(
mem::size_of::<u32>() + 2 * mem::size_of::<u32>() + mem::size_of::<u64>() + dl_data.len(),
);
data.write_u32::<LittleEndian>(epoch.0).unwrap();
data.write_u32::<LittleEndian>(pipeline_id.0).unwrap();
data.write_u32::<LittleEndian>(pipeline_id.1).unwrap();
data.write_u64::<LittleEndian>(dl_data.len() as u64)
.unwrap();
data.extend_from_slice(dl_data);
data
}
pub fn to_data(&self) -> Vec<u8> {
Self::construct_data(self.epoch, self.pipeline_id, &self.display_list_data)
}
pub fn from_data(data: &[u8]) -> Payload {
let mut payload_reader = Cursor::new(data);
let epoch = Epoch(payload_reader.read_u32::<LittleEndian>().unwrap());
let pipeline_id = PipelineId(
payload_reader.read_u32::<LittleEndian>().unwrap(),
payload_reader.read_u32::<LittleEndian>().unwrap(),
);
let dl_size = payload_reader.read_u64::<LittleEndian>().unwrap() as usize;
let mut built_display_list_data = vec![0; dl_size];
payload_reader
.read_exact(&mut built_display_list_data[..])
.unwrap();
assert_eq!(payload_reader.position(), data.len() as u64);
Payload {
epoch,
pipeline_id,
display_list_data: built_display_list_data,
}
}
}
pub trait PayloadSenderHelperMethods {
fn send_payload(&self, data: Payload) -> Result<(), Error>;
}
pub trait PayloadReceiverHelperMethods {
fn recv_payload(&self) -> Result<Payload, Error>;
fn to_mpsc_receiver(self) -> Receiver<Payload>;
}
#[cfg(not(feature = "ipc"))]
include!("channel_mpsc.rs");
#[cfg(feature = "ipc")]
include!("channel_ipc.rs");