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
use api::{Epoch, PipelineId};
use byteorder::{LittleEndian, ReadBytesExt, WriteBytesExt};
use std::io::{Cursor, Read};
use std::mem;
#[derive(Clone)]
pub struct Payload {
    
    
    
    
    
    pub epoch: Epoch,
    
    pub pipeline_id: PipelineId,
    pub display_list_data: Vec<u8>,
}
impl Payload {
    
    
    
    
    
    pub fn to_data(&self) -> Vec<u8> {
        let mut data = Vec::with_capacity(
            mem::size_of::<u32>() + 2 * mem::size_of::<u32>() + mem::size_of::<u64>() +
                self.display_list_data.len(),
        );
        data.write_u32::<LittleEndian>(self.epoch.0).unwrap();
        data.write_u32::<LittleEndian>(self.pipeline_id.0).unwrap();
        data.write_u32::<LittleEndian>(self.pipeline_id.1).unwrap();
        data.write_u64::<LittleEndian>(self.display_list_data.len() as u64)
            .unwrap();
        data.extend_from_slice(&self.display_list_data);
        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>;
}
#[cfg(not(feature = "ipc"))]
include!("channel_mpsc.rs");
#[cfg(feature = "ipc")]
include!("channel_ipc.rs");