Skip to content

Commit 2f7c583

Browse files
author
Eric Holk
committed
Cleaning up task and comm exports, updating all the test cases.
1 parent b31815f commit 2f7c583

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

60 files changed

+542
-522
lines changed

src/lib/aio.rs

Lines changed: 44 additions & 45 deletions
Original file line numberDiff line numberDiff line change
@@ -2,11 +2,10 @@ import task;
22
import vec;
33

44
import comm;
5-
import comm::_chan;
6-
import comm::_port;
7-
import comm::mk_port;
5+
import comm::chan;
6+
import comm::port;
87
import comm::send;
9-
8+
import comm::recv;
109
import net;
1110

1211
native "rust" mod rustrt {
@@ -15,11 +14,11 @@ native "rust" mod rustrt {
1514
fn aio_init();
1615
fn aio_run();
1716
fn aio_stop();
18-
fn aio_connect(host: *u8, port: int, connected: &_chan<socket>);
19-
fn aio_serve(host: *u8, port: int, acceptChan: &_chan<socket>) -> server;
20-
fn aio_writedata(s: socket, buf: *u8, size: uint, status: &_chan<bool>);
21-
fn aio_read(s: socket, reader: &_chan<[u8]>);
22-
fn aio_close_server(s: server, status: &_chan<bool>);
17+
fn aio_connect(host: *u8, port: int, connected: &chan<socket>);
18+
fn aio_serve(host: *u8, port: int, acceptChan: &chan<socket>) -> server;
19+
fn aio_writedata(s: socket, buf: *u8, size: uint, status: &chan<bool>);
20+
fn aio_read(s: socket, reader: &chan<[u8]>);
21+
fn aio_close_server(s: server, status: &chan<bool>);
2322
fn aio_close_socket(s: socket);
2423
fn aio_is_null_client(s: socket) -> bool;
2524
}
@@ -32,42 +31,42 @@ tag pending_connection { remote(net::ip_addr, int); incoming(server); }
3231

3332
tag socket_event { connected(client); closed; received([u8]); }
3433

35-
tag server_event { pending(_chan<_chan<socket_event>>); }
34+
tag server_event { pending(chan<chan<socket_event>>); }
3635

3736
tag request {
3837
quit;
39-
connect(pending_connection, _chan<socket_event>);
40-
serve(net::ip_addr, int, _chan<server_event>, _chan<server>);
41-
write(client, [u8], _chan<bool>);
42-
close_server(server, _chan<bool>);
38+
connect(pending_connection, chan<socket_event>);
39+
serve(net::ip_addr, int, chan<server_event>, chan<server>);
40+
write(client, [u8], chan<bool>);
41+
close_server(server, chan<bool>);
4342
close_client(client);
4443
}
4544

46-
type ctx = _chan<request>;
45+
type ctx = chan<request>;
4746

4847
fn ip_to_sbuf(ip: net::ip_addr) -> *u8 {
4948
vec::to_ptr(str::bytes(net::format_addr(ip)))
5049
}
5150

52-
fn connect_task(ip: net::ip_addr, portnum: int, evt: _chan<socket_event>) {
53-
let connecter: _port<client> = mk_port();
54-
rustrt::aio_connect(ip_to_sbuf(ip), portnum, connecter.mk_chan());
55-
let client = connecter.recv();
51+
fn connect_task(ip: net::ip_addr, portnum: int, evt: chan<socket_event>) {
52+
let connecter = port();
53+
rustrt::aio_connect(ip_to_sbuf(ip), portnum, chan(connecter));
54+
let client = recv(connecter);
5655
new_client(client, evt);
5756
}
5857

59-
fn new_client(client: client, evt: _chan<socket_event>) {
58+
fn new_client(client: client, evt: chan<socket_event>) {
6059
// Start the read before notifying about the connect. This avoids a race
6160
// condition where the receiver can close the socket before we start
6261
// reading.
63-
let reader: _port<[u8]> = mk_port();
64-
rustrt::aio_read(client, reader.mk_chan());
62+
let reader: port<[u8]> = port();
63+
rustrt::aio_read(client, chan(reader));
6564

6665
send(evt, connected(client));
6766

6867
while true {
6968
log "waiting for bytes";
70-
let data: [u8] = reader.recv();
69+
let data: [u8] = recv(reader);
7170
log "got some bytes";
7271
log vec::len::<u8>(data);
7372
if vec::len::<u8>(data) == 0u {
@@ -83,42 +82,42 @@ fn new_client(client: client, evt: _chan<socket_event>) {
8382
log "close message sent";
8483
}
8584

86-
fn accept_task(client: client, events: _chan<server_event>) {
85+
fn accept_task(client: client, events: chan<server_event>) {
8786
log "accept task was spawned";
88-
let p: _port<_chan<socket_event>> = mk_port();
89-
send(events, pending(p.mk_chan()));
90-
let evt = p.recv();
87+
let p = port();
88+
send(events, pending(chan(p)));
89+
let evt = recv(p);
9190
new_client(client, evt);
9291
log "done accepting";
9392
}
9493

95-
fn server_task(ip: net::ip_addr, portnum: int, events: _chan<server_event>,
96-
server: _chan<server>) {
97-
let accepter: _port<client> = mk_port();
94+
fn server_task(ip: net::ip_addr, portnum: int, events: chan<server_event>,
95+
server: chan<server>) {
96+
let accepter = port();
9897
send(server,
99-
rustrt::aio_serve(ip_to_sbuf(ip), portnum, accepter.mk_chan()));
98+
rustrt::aio_serve(ip_to_sbuf(ip), portnum, chan(accepter)));
10099

101100
let client: client;
102101
while true {
103102
log "preparing to accept a client";
104-
client = accepter.recv();
103+
client = recv(accepter);
105104
if rustrt::aio_is_null_client(client) {
106105
log "client was actually null, returning";
107106
ret;
108-
} else { task::_spawn(bind accept_task(client, events)); }
107+
} else { task::spawn(bind accept_task(client, events)); }
109108
}
110109
}
111110

112-
fn request_task(c: _chan<ctx>) {
111+
fn request_task(c: chan<ctx>) {
113112
// Create a port to accept IO requests on
114-
let p: _port<request> = mk_port();
113+
let p = port();
115114
// Hand of its channel to our spawner
116-
send(c, p.mk_chan());
115+
send(c, chan(p));
117116
log "uv run task spawned";
118117
// Spin for requests
119118
let req: request;
120119
while true {
121-
req = p.recv();
120+
req = recv(p);
122121
alt req {
123122
quit. {
124123
log "got quit message";
@@ -127,10 +126,10 @@ fn request_task(c: _chan<ctx>) {
127126
ret;
128127
}
129128
connect(remote(ip, portnum), client) {
130-
task::_spawn(bind connect_task(ip, portnum, client));
129+
task::spawn(bind connect_task(ip, portnum, client));
131130
}
132131
serve(ip, portnum, events, server) {
133-
task::_spawn(bind server_task(ip, portnum, events, server));
132+
task::spawn(bind server_task(ip, portnum, events, server));
134133
}
135134
write(socket, v, status) {
136135
rustrt::aio_writedata(socket, vec::to_ptr::<u8>(v),
@@ -148,27 +147,27 @@ fn request_task(c: _chan<ctx>) {
148147
}
149148
}
150149

151-
fn iotask(c: _chan<ctx>) {
150+
fn iotask(c: chan<ctx>) {
152151
log "io task spawned";
153152
// Initialize before accepting requests
154153
rustrt::aio_init();
155154

156155
log "io task init";
157156
// Spawn our request task
158-
let reqtask = task::_spawn(bind request_task(c));
157+
let reqtask = task::spawn_joinable(bind request_task(c));
159158

160159
log "uv run task init";
161160
// Enter IO loop. This never returns until aio_stop is called.
162161
rustrt::aio_run();
163162
log "waiting for request task to finish";
164163

165-
task::join_id(reqtask);
164+
task::join(reqtask);
166165
}
167166

168167
fn new() -> ctx {
169-
let p: _port<ctx> = mk_port();
170-
task::_spawn(bind iotask(p.mk_chan()));
171-
ret p.recv();
168+
let p: port<ctx> = port();
169+
task::spawn(bind iotask(chan(p)));
170+
ret recv(p);
172171
}
173172

174173
// Local Variables:

src/lib/comm.rs

Lines changed: 8 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -2,12 +2,7 @@ import sys;
22
import ptr;
33
import unsafe;
44
import task;
5-
import task::task_id;
65

7-
export _chan;
8-
export _port;
9-
export chan_handle;
10-
export mk_port;
116
export send;
127
export recv;
138
export chan;
@@ -17,7 +12,8 @@ native "rust" mod rustrt {
1712
type void;
1813
type rust_port;
1914

20-
fn chan_id_send<~T>(target_task: task_id, target_port: port_id, data: -T);
15+
fn chan_id_send<~T>(target_task: task::task,
16+
target_port: port_id, data: -T);
2117

2218
fn new_port(unit_sz: uint) -> *rust_port;
2319
fn del_port(po: *rust_port);
@@ -31,10 +27,9 @@ native "rust-intrinsic" mod rusti {
3127

3228
type port_id = int;
3329

34-
type chan_handle<~T> = {task: task_id, port: port_id};
35-
36-
tag chan<~T> { chan_t(chan_handle<T>); }
37-
type _chan<~T> = chan<T>;
30+
// It's critical that this only have one variant, so it has a record
31+
// layout, and will work in the rust_task structure in task.rs.
32+
tag chan<~T> { chan_t(task::task, port_id); }
3833

3934
resource port_ptr(po: *rustrt::rust_port) {
4035
rustrt::drop_port(po);
@@ -43,17 +38,9 @@ resource port_ptr(po: *rustrt::rust_port) {
4338

4439
tag port<~T> { port_t(@port_ptr); }
4540

46-
obj port_obj<~T>(raw_port: port<T>) {
47-
fn mk_chan() -> chan<T> { chan(raw_port) }
48-
49-
fn recv() -> T { recv(raw_port) }
50-
}
51-
type _port<~T> = port_obj<T>;
52-
53-
fn mk_port<~T>() -> _port<T> { ret port_obj::<T>(port::<T>()); }
54-
5541
fn send<~T>(ch: &chan<T>, data: -T) {
56-
rustrt::chan_id_send(ch.task, ch.port, data);
42+
let chan_t(t, p) = ch;
43+
rustrt::chan_id_send(t, p, data);
5744
}
5845

5946
fn port<~T>() -> port<T> {
@@ -63,5 +50,5 @@ fn port<~T>() -> port<T> {
6350
fn recv<~T>(p: &port<T>) -> T { ret rusti::recv(***p) }
6451

6552
fn chan<~T>(p: &port<T>) -> chan<T> {
66-
chan_t({task: task::get_task_id(), port: rustrt::get_port_id(***p)})
53+
chan_t(task::get_task_id(), rustrt::get_port_id(***p))
6754
}

src/lib/sio.rs

Lines changed: 24 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,78 +1,78 @@
1-
import comm::_port;
2-
import comm::_chan;
3-
import comm::mk_port;
1+
import comm::port;
2+
import comm::chan;
43
import comm::send;
4+
import comm::recv;
55

66
import str;
77
import net;
88

99
type ctx = aio::ctx;
10-
type client = {ctx: ctx, client: aio::client, evt: _port<aio::socket_event>};
11-
type server = {ctx: ctx, server: aio::server, evt: _port<aio::server_event>};
10+
type client = {ctx: ctx, client: aio::client, evt: port<aio::socket_event>};
11+
type server = {ctx: ctx, server: aio::server, evt: port<aio::server_event>};
1212

1313
fn new() -> ctx { ret aio::new(); }
1414

1515
fn destroy(ctx: ctx) { send(ctx, aio::quit); }
1616

17-
fn make_socket(ctx: ctx, p: _port<aio::socket_event>) -> client {
18-
let evt: aio::socket_event = p.recv();
17+
fn make_socket(ctx: ctx, p: port<aio::socket_event>) -> client {
18+
let evt: aio::socket_event = recv(p);
1919
alt evt {
2020
aio::connected(client) { ret {ctx: ctx, client: client, evt: p}; }
2121
_ { fail "Could not connect to client"; }
2222
}
2323
}
2424

2525
fn connect_to(ctx: ctx, ip: net::ip_addr, portnum: int) -> client {
26-
let p: _port<aio::socket_event> = mk_port();
27-
send(ctx, aio::connect(aio::remote(ip, portnum), p.mk_chan()));
26+
let p: port<aio::socket_event> = port();
27+
send(ctx, aio::connect(aio::remote(ip, portnum), chan(p)));
2828
ret make_socket(ctx, p);
2929
}
3030

3131
fn read(c: client) -> [u8] {
32-
alt c.evt.recv() {
32+
alt recv(c.evt) {
3333
aio::closed. { ret []; }
3434
aio::received(buf) { ret buf; }
3535
}
3636
}
3737

3838
fn create_server(ctx: ctx, ip: net::ip_addr, portnum: int) -> server {
39-
let evt: _port<aio::server_event> = mk_port();
40-
let p: _port<aio::server> = mk_port();
41-
send(ctx, aio::serve(ip, portnum, evt.mk_chan(), p.mk_chan()));
42-
let srv: aio::server = p.recv();
39+
let evt: port<aio::server_event> = port();
40+
let p: port<aio::server> = port();
41+
send(ctx, aio::serve(ip, portnum, chan(evt), chan(p)));
42+
let srv: aio::server = recv(p);
4343
ret {ctx: ctx, server: srv, evt: evt};
4444
}
4545

4646
fn accept_from(server: server) -> client {
47-
let evt: aio::server_event = server.evt.recv();
47+
let evt: aio::server_event = recv(server.evt);
4848
alt evt {
4949
aio::pending(callback) {
50-
let p: _port<aio::socket_event> = mk_port();
51-
send(callback, p.mk_chan());
50+
let p = port();
51+
send(callback, chan(p));
5252
ret make_socket(server.ctx, p);
5353
}
5454
}
5555
}
5656

5757
fn write_data(c: client, data: [u8]) -> bool {
58-
let p: _port<bool> = mk_port();
59-
send(c.ctx, aio::write(c.client, data, p.mk_chan()));
60-
ret p.recv();
58+
let p = port();
59+
send(c.ctx, aio::write(c.client, data, chan(p)));
60+
ret recv(p);
6161
}
6262

6363
fn close_server(server: server) {
6464
// TODO: make this unit once we learn to send those from native code
65-
let p: _port<bool> = mk_port();
66-
send(server.ctx, aio::close_server(server.server, p.mk_chan()));
65+
let p = port();
66+
send(server.ctx, aio::close_server(server.server, chan(p)));
6767
log "Waiting for close";
68-
p.recv();
68+
recv(p);
6969
log "Got close";
7070
}
7171

7272
fn close_client(client: client) {
7373
send(client.ctx, aio::close_client(client.client));
7474
let evt: aio::socket_event;
75-
do { evt = client.evt.recv(); alt evt { aio::closed. { ret; } _ { } } }
75+
do { evt = recv(client.evt); alt evt { aio::closed. { ret; } _ { } } }
7676
while true
7777
}
7878

0 commit comments

Comments
 (0)