From 1c1b3a33397a38bf412e242b8f00abfa49ed78bd Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Mon, 9 Jul 2012 15:29:23 -0700 Subject: [PATCH] Added peek for pipes. --- src/libcore/pipes.rs | 23 +++++++++++++++++++++++ src/test/run-pass/pipe-peek.rs | 23 +++++++++++++++++++++++ 2 files changed, 46 insertions(+) create mode 100644 src/test/run-pass/pipe-peek.rs diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 1d6d70defb95..6f61b12ab409 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -144,6 +144,15 @@ fn recv(-p: recv_packet) -> option { } } +/// Returns true if messages are available. +fn peek(p: recv_packet) -> bool { + alt p.header().state { + empty { false } + blocked { fail "peeking on blocked packet" } + full | terminated { true } + } +} + fn sender_terminate(p: *packet) { let p = unsafe { uniquify(p) }; alt swap_state_rel(p.header.state, terminated) { @@ -337,6 +346,20 @@ class recv_packet { p <-> self.p; option::unwrap(p) } + + fn header() -> &self.packet_header { + alt self.p { + some(packet) { + unsafe { + let packet = uniquify(packet); + let header = reinterpret_cast(&packet.header); + forget(packet); + header + } + } + none { fail "packet already consumed" } + } + } } fn entangle() -> (send_packet, recv_packet) { diff --git a/src/test/run-pass/pipe-peek.rs b/src/test/run-pass/pipe-peek.rs new file mode 100644 index 000000000000..9a2451cd47a0 --- /dev/null +++ b/src/test/run-pass/pipe-peek.rs @@ -0,0 +1,23 @@ +// xfail-pretty + +use std; +import std::timer::sleep; +import std::uv; + +proto! oneshot { + waiting:send { + signal -> signaled + } + + signaled:send { } +} + +fn main() { + let (c, p) = oneshot::init(); + + assert !pipes::peek(p); + + oneshot::client::signal(c); + + assert pipes::peek(p); +}