From 6a10e3a71324cddce3e4dcb21f1b43dcdec89775 Mon Sep 17 00:00:00 2001 From: Eric Holk Date: Thu, 9 Aug 2012 11:54:56 -0700 Subject: [PATCH] Added oneshot protocol. Fixes #3125 --- src/libcore/pipes.rs | 36 ++++++++++++++++++++++++++++++++++++ 1 file changed, 36 insertions(+) diff --git a/src/libcore/pipes.rs b/src/libcore/pipes.rs index 042d107b990d..052efdf3b41e 100644 --- a/src/libcore/pipes.rs +++ b/src/libcore/pipes.rs @@ -76,6 +76,7 @@ export send_packet, recv_packet, send, recv, try_recv, peek; export select, select2, selecti, select2i, selectable; export spawn_service, spawn_service_recv; export stream, port, chan, shared_chan, port_set, channel; +export oneshot, recv_one, try_recv_one; #[doc(hidden)] const SPIN_COUNT: uint = 0; @@ -1103,6 +1104,32 @@ impl, Right: selectable recv> } } +proto! oneshot { + oneshot:send { + send(T) -> ! + } +} + +/// Receive a message from a oneshot pipe. +fn recv_one(+port: oneshot::server::oneshot) -> T { + let oneshot::send(message) = recv(port); + message +} + +/** Receive a message from a oneshot pipe, or fail if the connection +is closed. + +*/ +fn try_recv_one (+port: oneshot::server::oneshot) -> option { + let message = try_recv(port); + + if message == none { none } + else { + let oneshot::send(message) = option::unwrap(message); + some(message) + } +} + #[cfg(test)] mod test { #[test] @@ -1119,4 +1146,13 @@ mod test { c2.send(123); } + + #[test] + fn test_oneshot() { + let (c, p) = oneshot::init(); + + oneshot::client::send(c, ()); + + recv_one(p) + } }