Skip to content

Commit 594d9a0

Browse files
committed
Use protocol compiler in future.rs. Also split recv into recv and try_recv.
1 parent 26e6eb3 commit 594d9a0

File tree

8 files changed

+22
-70
lines changed

8 files changed

+22
-70
lines changed

src/libcore/future.rs

Lines changed: 3 additions & 50 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
*/
1313

1414
import either::either;
15+
import pipes::recv;
1516

1617
export future;
1718
export extensions;
@@ -60,10 +61,6 @@ fn from_value<A>(+val: A) -> future<A> {
6061
}
6162

6263
fn macros() {
63-
#macro[
64-
[#recv[chan],
65-
chan.recv()(chan)]
66-
];
6764
#macro[
6865
[#move[x],
6966
unsafe { let y <- *ptr::addr_of(x); y }]
@@ -77,14 +74,13 @@ fn from_port<A:send>(-port: future_pipe::client::waiting<A>) -> future<A> {
7774
The first time that the value is requested the task will block
7875
waiting for the result to be received on the port.
7976
"];
80-
import future_pipe::client::recv;
8177

8278
let port = ~mut some(port);
8379
do from_fn |move port| {
8480
let mut port_ = none;
8581
port_ <-> *port;
8682
let port = option::unwrap(port_);
87-
alt (#recv(port)) {
83+
alt recv(port) {
8884
future_pipe::completed(data, _next) { #move(data) }
8985
}
9086
}
@@ -137,55 +133,12 @@ fn with<A,B>(future: future<A>, blk: fn(A) -> B) -> B {
137133
blk(*v)
138134
}
139135

140-
// The pipe protocol, generated by pipec
141-
/*
142136
proto! future_pipe {
143137
waiting:recv<T:send> {
144138
completed(T) -> terminated
145139
}
146140

147-
terminated { }
148-
}
149-
*/
150-
mod future_pipe {
151-
fn init<T: send>() -> (client::waiting<T>, server::waiting<T>) {
152-
{ let (s, c) = pipes::entangle(); (c, s) }
153-
}
154-
enum waiting<T: send> { completed(T, client::terminated), }
155-
enum terminated { }
156-
mod client {
157-
impl recv<T: send> for waiting<T> {
158-
fn recv() -> extern fn(+waiting<T>) -> future_pipe::waiting<T> {
159-
fn recv<T: send>(+pipe: waiting<T>) ->
160-
future_pipe::waiting<T> {
161-
option::unwrap(pipes::recv(pipe))
162-
}
163-
recv
164-
}
165-
}
166-
type waiting<T: send> = pipes::recv_packet<future_pipe::waiting<T>>;
167-
type terminated = pipes::send_packet<future_pipe::terminated>;
168-
}
169-
mod server {
170-
fn completed<T: send>(+pipe: waiting<T>, +x_0: T) -> terminated {
171-
{
172-
let (s, c) = pipes::entangle();
173-
let message = future_pipe::completed(x_0, s);
174-
pipes::send(pipe, message);
175-
c
176-
}
177-
}
178-
type waiting<T: send> = pipes::send_packet<future_pipe::waiting<T>>;
179-
impl recv for terminated {
180-
fn recv() -> extern fn(+terminated) -> future_pipe::terminated {
181-
fn recv(+pipe: terminated) -> future_pipe::terminated {
182-
option::unwrap(pipes::recv(pipe))
183-
}
184-
recv
185-
}
186-
}
187-
type terminated = pipes::recv_packet<future_pipe::terminated>;
188-
}
141+
terminated:send { }
189142
}
190143

191144
#[test]

src/libcore/pipes.rs

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -117,7 +117,11 @@ fn send<T: send>(-p: send_packet<T>, -payload: T) {
117117
}
118118
}
119119

120-
fn recv<T: send>(-p: recv_packet<T>) -> option<T> {
120+
fn recv<T: send>(-p: recv_packet<T>) -> T {
121+
option::unwrap(try_recv(p))
122+
}
123+
124+
fn try_recv<T: send>(-p: recv_packet<T>) -> option<T> {
121125
let p_ = p.unwrap();
122126
let p = unsafe { uniquify(p_) };
123127
let this = rustrt::rust_get_task();
@@ -288,10 +292,10 @@ fn select2<A: send, B: send>(
288292

289293
unsafe {
290294
alt i {
291-
0 { left((recv(recv_packet(transmute(a))),
295+
0 { left((try_recv(recv_packet(transmute(a))),
292296
recv_packet(transmute(b)))) }
293297
1 { right((recv_packet(transmute(a)),
294-
recv(recv_packet(transmute(b))))) }
298+
try_recv(recv_packet(transmute(b))))) }
295299
_ { fail "select2 return an invalid packet" }
296300
}
297301
}
@@ -312,7 +316,7 @@ fn select<T: send>(+endpoints: ~[recv_packet<T>])
312316
do vec::consume(endpoints) |i, p| {
313317
let p = recv_packet(unsafe { unsafe::transmute(p) });
314318
if i == ready {
315-
result = recv(p);
319+
result = try_recv(p);
316320
}
317321
else {
318322
vec::push(remaining, p);

src/test/bench/msgsend-ring-pipes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ fn thread_ring(i: uint,
4343
num_port2 <-> num_port;
4444
num_chan = some(ring::client::num(option::unwrap(num_chan2), i * j));
4545
let port = option::unwrap(num_port2);
46-
alt (option::unwrap(recv(port))) {
46+
alt recv(port) {
4747
ring::num(_n, p) {
4848
//log(error, _n);
4949
num_port = some(#move(p));

src/test/bench/shootout-k-nucleotide-pipes.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@ mod stream {
4343
let mut endp = none;
4444
endp <-> self.endp;
4545
let streamp::data(x, endp) = unwrap(
46-
pipes::recv(unwrap(endp)));
46+
pipes::try_recv(unwrap(endp)));
4747
self.endp = some(endp);
4848
x
4949
}

src/test/run-pass/pipe-bank-proto.rs

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@
44
//
55
// http://theincredibleholk.wordpress.com/2012/07/06/rusty-pipes/
66

7-
import pipes::recv;
7+
import pipes::try_recv;
88

99
type username = str;
1010
type password = str;
@@ -43,7 +43,7 @@ fn bank_client(+bank: bank::client::login) {
4343
import bank::*;
4444

4545
let bank = client::login(bank, "theincredibleholk", "1234");
46-
let bank = alt recv(bank) {
46+
let bank = alt try_recv(bank) {
4747
some(ok(connected)) {
4848
#move(connected)
4949
}
@@ -53,7 +53,7 @@ fn bank_client(+bank: bank::client::login) {
5353

5454
let bank = client::deposit(bank, 100.00);
5555
let bank = client::withdrawal(bank, 50.00);
56-
alt recv(bank) {
56+
alt try_recv(bank) {
5757
some(money(m, _)) {
5858
io::println("Yay! I got money!");
5959
}

src/test/run-pass/pipe-detect-term.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,7 +6,7 @@ use std;
66
import std::timer::sleep;
77
import std::uv;
88

9-
import pipes::{recv};
9+
import pipes::{try_recv, recv};
1010

1111
proto! oneshot {
1212
waiting:send {
@@ -20,7 +20,7 @@ fn main() {
2020
let iotask = uv::global_loop::get();
2121

2222
let c = pipes::spawn_service(oneshot::init, |p| {
23-
alt recv(p) {
23+
alt try_recv(p) {
2424
some(*) { fail }
2525
none { }
2626
}

src/test/run-pass/pipe-pingpong-proto.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -21,14 +21,14 @@ mod test {
2121

2222
let chan = client::ping(chan);
2323
log(error, "Sent ping");
24-
let pong(_chan) = option::unwrap(recv(chan));
24+
let pong(_chan) = recv(chan);
2525
log(error, "Received pong");
2626
}
2727

2828
fn server(-chan: pingpong::server::ping) {
2929
import pingpong::server;
3030

31-
let ping(chan) = option::unwrap(recv(chan));
31+
let ping(chan) = recv(chan);
3232
log(error, "Received ping");
3333
let _chan = server::pong(chan);
3434
log(error, "Sent pong");

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

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -26,14 +26,9 @@ fn main() {
2626

2727
let iotask = uv::global_loop::get();
2828

29-
#macro[
30-
[#recv[chan],
31-
chan.recv()(chan)]
32-
];
33-
3429
let c = pipes::spawn_service(stream::init, |p| {
3530
#error("waiting for pipes");
36-
let stream::send(x, p) = option::unwrap(recv(p));
31+
let stream::send(x, p) = recv(p);
3732
#error("got pipes");
3833
let (left, right) : (oneshot::server::waiting,
3934
oneshot::server::waiting)
@@ -44,7 +39,7 @@ fn main() {
4439
assert i == 0;
4540

4641
#error("waiting for pipes");
47-
let stream::send(x, _) = option::unwrap(recv(p));
42+
let stream::send(x, _) = recv(p);
4843
#error("got pipes");
4944
let (left, right) : (oneshot::server::waiting,
5045
oneshot::server::waiting)

0 commit comments

Comments
 (0)