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
94
95
96
97
98
use {AsHandleRef, HandleBased, Handle, HandleRef, Status};
use {sys, ok};
#[derive(Debug, Eq, PartialEq)]
pub struct Fifo(Handle);
impl_handle_based!(Fifo);
impl Fifo {
pub fn create(elem_count: u32, elem_size: u32)
-> Result<(Fifo, Fifo), Status>
{
let mut out0 = 0;
let mut out1 = 0;
let options = 0;
let status = unsafe {
sys::zx_fifo_create(elem_count, elem_size, options, &mut out0, &mut out1)
};
ok(status)?;
unsafe { Ok((
Self::from(Handle::from_raw(out0)),
Self::from(Handle::from_raw(out1))
))}
}
pub fn write(&self, bytes: &[u8]) -> Result<u32, Status> {
let mut num_entries_written = 0;
let status = unsafe {
sys::zx_fifo_write(self.raw_handle(), bytes.as_ptr(), bytes.len(),
&mut num_entries_written)
};
ok(status).map(|()| num_entries_written)
}
pub fn read(&self, bytes: &mut [u8]) -> Result<u32, Status> {
let mut num_entries_read = 0;
let status = unsafe {
sys::zx_fifo_read(self.raw_handle(), bytes.as_mut_ptr(), bytes.len(),
&mut num_entries_read)
};
ok(status).map(|()| num_entries_read)
}
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn fifo_basic() {
let (fifo1, fifo2) = Fifo::create(4, 2).unwrap();
assert_eq!(fifo1.write(b""), Err(Status::OUT_OF_RANGE));
assert_eq!(fifo1.write(b"h"), Err(Status::OUT_OF_RANGE));
assert_eq!(fifo1.write(b"hex").unwrap(), 1);
assert_eq!(fifo1.write(b"llo worlds").unwrap(), 3);
assert_eq!(fifo1.write(b"blah blah"), Err(Status::SHOULD_WAIT));
let mut read_vec = vec![0; 8];
assert_eq!(fifo2.read(&mut read_vec).unwrap(), 4);
assert_eq!(read_vec, b"hello wo");
assert_eq!(fifo2.read(&mut read_vec), Err(Status::SHOULD_WAIT));
}
}