Skip to content

Commit a3472a9

Browse files
author
Eric Holk
committed
---
yaml --- r: 4773 b: refs/heads/master c: efac7c9 h: refs/heads/master i: 4771: e72bbed v: v3
1 parent ec2d2c1 commit a3472a9

File tree

4 files changed

+37
-18
lines changed

4 files changed

+37
-18
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,2 +1,2 @@
11
---
2-
refs/heads/master: 72b2f8207d6b626bc2514b830ef4d91580f08637
2+
refs/heads/master: efac7c9a197fa3ff3497ce99a2dda8693b3ef683

trunk/src/lib/comm.rs

Lines changed: 28 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -10,16 +10,14 @@ export _port;
1010
export mk_port;
1111
export chan_from_unsafe_ptr;
1212
export send;
13+
export recv;
14+
export chan;
15+
export port;
1316

1417
native "rust" mod rustrt {
1518
type void;
16-
type rust_chan;
1719
type rust_port;
1820

19-
fn new_chan(po : *rust_port) -> *rust_chan;
20-
fn take_chan(ch : *rust_chan);
21-
fn drop_chan(ch : *rust_chan);
22-
fn chan_send(ch: *rust_chan, v : *void);
2321
fn chan_id_send<~T>(target_task : task_id, target_port : port_id,
2422
data : -T);
2523

@@ -35,34 +33,50 @@ native "rust-intrinsic" mod rusti {
3533

3634
type port_id = int;
3735

38-
type _chan<~T> = {
36+
type chan<~T> = {
3937
task : task_id,
4038
port : port_id
4139
};
40+
type _chan<~T> = chan<T>;
4241

4342
resource port_ptr(po: *rustrt::rust_port) {
4443
rustrt::drop_port(po);
4544
rustrt::del_port(po);
4645
}
4746

48-
obj _port<~T>(raw_port : @port_ptr) {
47+
type port<~T> = @port_ptr;
48+
49+
obj port_obj<~T>(raw_port : port<T>) {
4950
// FIXME: rename this to chan once chan is not a keyword.
5051
fn mk_chan() -> _chan<T> {
51-
{
52-
task: task::get_task_id(),
53-
port: rustrt::get_port_id(**raw_port)
54-
}
52+
chan::<T>(raw_port)
5553
}
5654

5755
fn recv() -> T {
58-
ret rusti::recv(**raw_port)
56+
recv(raw_port)
5957
}
6058
}
59+
type _port<~T> = port_obj<T>;
6160

6261
fn mk_port<~T>() -> _port<T> {
63-
_port(@port_ptr(rustrt::new_port(sys::size_of::<T>())))
62+
ret port_obj::<T>(port::<T>());
6463
}
6564

66-
fn send<~T>(ch : _chan<T>, data : -T) {
65+
fn send<~T>(ch : chan<T>, data : -T) {
6766
rustrt::chan_id_send(ch.task, ch.port, data);
6867
}
68+
69+
fn port<~T>() -> port<T> {
70+
@port_ptr(rustrt::new_port(sys::size_of::<T>()))
71+
}
72+
73+
fn recv<~T>(p : port<T>) -> T {
74+
ret rusti::recv(**p)
75+
}
76+
77+
fn chan<~T>(p : port<T>) -> chan<T> {
78+
{
79+
task: task::get_task_id(),
80+
port: rustrt::get_port_id(**p)
81+
}
82+
}

trunk/src/rt/rustrt.def.in

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -16,14 +16,12 @@ debug_box
1616
debug_fn
1717
debug_obj
1818
debug_opaque
19-
del_chan
2019
del_port
2120
debug_ptrcast
2221
debug_tag
2322
debug_trap
2423
debug_tydesc
2524
do_gc
26-
drop_chan
2725
drop_port
2826
drop_task
2927
get_port_id
@@ -77,7 +75,6 @@ str_from_cstr
7775
str_from_ivec
7876
str_push_byte
7977
str_slice
80-
take_chan
8178
task_sleep
8279
task_yield
8380
task_join

trunk/src/test/stdtest/comm.rs

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,3 +17,11 @@ fn send_recv() {
1717
log_err v;
1818
assert(42 == v);
1919
}
20+
21+
#[test]
22+
fn send_recv_fn() {
23+
let p = comm::port::<int>();
24+
let c = comm::chan::<int>(p);
25+
comm::send(c, 42);
26+
assert(comm::recv(p) == 42);
27+
}

0 commit comments

Comments
 (0)