Skip to content

Commit 1c1b3a3

Browse files
committed
Added peek for pipes.
1 parent 69cd8b5 commit 1c1b3a3

File tree

2 files changed

+46
-0
lines changed

2 files changed

+46
-0
lines changed

src/libcore/pipes.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,15 @@ fn recv<T: send>(-p: recv_packet<T>) -> option<T> {
144144
}
145145
}
146146

147+
/// Returns true if messages are available.
148+
fn peek<T: send>(p: recv_packet<T>) -> bool {
149+
alt p.header().state {
150+
empty { false }
151+
blocked { fail "peeking on blocked packet" }
152+
full | terminated { true }
153+
}
154+
}
155+
147156
fn sender_terminate<T: send>(p: *packet<T>) {
148157
let p = unsafe { uniquify(p) };
149158
alt swap_state_rel(p.header.state, terminated) {
@@ -337,6 +346,20 @@ class recv_packet<T: send> {
337346
p <-> self.p;
338347
option::unwrap(p)
339348
}
349+
350+
fn header() -> &self.packet_header {
351+
alt self.p {
352+
some(packet) {
353+
unsafe {
354+
let packet = uniquify(packet);
355+
let header = reinterpret_cast(&packet.header);
356+
forget(packet);
357+
header
358+
}
359+
}
360+
none { fail "packet already consumed" }
361+
}
362+
}
340363
}
341364

342365
fn entangle<T: send>() -> (send_packet<T>, recv_packet<T>) {

src/test/run-pass/pipe-peek.rs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// xfail-pretty
2+
3+
use std;
4+
import std::timer::sleep;
5+
import std::uv;
6+
7+
proto! oneshot {
8+
waiting:send {
9+
signal -> signaled
10+
}
11+
12+
signaled:send { }
13+
}
14+
15+
fn main() {
16+
let (c, p) = oneshot::init();
17+
18+
assert !pipes::peek(p);
19+
20+
oneshot::client::signal(c);
21+
22+
assert pipes::peek(p);
23+
}

0 commit comments

Comments
 (0)