Skip to content

Commit c74aceb

Browse files
olsonjefferybrson
authored andcommitted
---
yaml --- r: 15988 b: refs/heads/try c: a40f550 h: refs/heads/master v: v3
1 parent 1932bed commit c74aceb

File tree

2 files changed

+67
-5
lines changed

2 files changed

+67
-5
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,5 +2,5 @@
22
refs/heads/master: 61b1875c16de39c166b0f4d54bba19f9c6777d1a
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 4a81779abd786ff22d71434c6d9a5917ea4cdfff
5-
refs/heads/try: a4b1e965e2815924f6ae1a0cac8a327b41ee4608
5+
refs/heads/try: a40f550ed5b159fcfc1540df538b8f0b6acd01a7
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105

branches/try/src/libstd/net_tcp.rs

Lines changed: 66 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -12,9 +12,12 @@ export tcp_socket, tcp_conn_port, tcp_err_data;
1212
// operations on a tcp_socket
1313
export write, read_start, read_stop;
1414
// tcp server stuff
15-
export new_listener, listen_for_conn, accept, conn_recv;
15+
export listen_for_conn, accept;
16+
export new_listener, conn_recv, conn_recv_spawn, conn_peek;
1617
// tcp client stuff
1718
export connect;
19+
// helper methods
20+
export conn_port_methods, sock_methods;
1821

1922
#[nolink]
2023
native mod rustrt {
@@ -410,6 +413,8 @@ fn new_listener(host_ip: ip::ip_addr, port: uint, backlog: uint)
410413
#[doc="
411414
Block on a `net::tcp::tcp_conn_port` until a new connection arrives
412415
416+
This function behaves similarly to `comm::recv()`
417+
413418
# Arguments
414419
415420
* server_port -- a `net::tcp::tcp_conn_port` that you wish to listen
@@ -436,6 +441,22 @@ fn conn_recv(server_port: tcp_conn_port)
436441
}
437442
}
438443

444+
#[doc="
445+
Identical to `net::tcp::conn_recv`, but ran on a new task
446+
447+
The recv'd tcp_socket is created with a new task on the current scheduler,
448+
and given as a parameter to the provided callback
449+
450+
# Arguments
451+
452+
* `server_port` -- a `net::tcp::tcp_conn_port` that you wish to listen
453+
on for an incoming connection
454+
* `cb` -- a callback that will be ran, in a new task on the current scheduler,
455+
once a new connection is recv'd. Its parameter:
456+
* A `result` object containing a `net::tcp::tcp_socket`, ready for immediate
457+
use, as the `ok` varient, or a `net::tcp::tcp_err_data` for the `err`
458+
variant
459+
"]
439460
fn conn_recv_spawn(server_port: tcp_conn_port,
440461
cb: fn~(result::result<tcp_socket, tcp_err_data>)) {
441462
let new_conn_po = (**server_port).new_conn_po;
@@ -454,6 +475,19 @@ fn conn_recv_spawn(server_port: tcp_conn_port,
454475
};
455476
}
456477

478+
#[doc="
479+
Check if a `net::tcp::tcp_conn_port` has one-or-more pending, new connections
480+
481+
This function behaves similarly to `comm::peek()`
482+
483+
# Arguments
484+
485+
* `server_port` -- a `net::tcp::tcp_conn_port` representing a server connection
486+
487+
# Returns
488+
489+
`true` if there are one-or-more pending connections, `false` if there are none.
490+
"]
457491
fn conn_peek(server_port: tcp_conn_port) -> bool {
458492
let new_conn_po = (**server_port).new_conn_po;
459493
comm::peek(new_conn_po)
@@ -713,6 +747,33 @@ fn listen_for_conn(host_ip: ip::ip_addr, port: uint, backlog: uint,
713747
}
714748
}
715749

750+
#[doc="
751+
Convenience methods extending `net::tcp::tcp_conn_port`
752+
"]
753+
impl conn_port_methods for tcp_conn_port {
754+
fn recv() -> result::result<tcp_socket, tcp_err_data> { conn_recv(self) }
755+
fn recv_spawn(cb: fn~(result::result<tcp_socket,tcp_err_data>))
756+
{ conn_recv_spawn(self, cb); }
757+
fn peek() -> bool { conn_peek(self) }
758+
}
759+
760+
#[doc="
761+
Convenience methods extending `net::tcp::tcp_socket`
762+
"]
763+
impl sock_methods for tcp_socket {
764+
fn read_start() -> result::result<comm::port<
765+
result::result<[u8], tcp_err_data>>, tcp_err_data> {
766+
read_start(self)
767+
}
768+
fn read_stop() ->
769+
result::result<(), tcp_err_data> {
770+
read_stop(self)
771+
}
772+
fn write(raw_write_data: [[u8]])
773+
-> result::result<(), tcp_err_data> {
774+
write(self, raw_write_data)
775+
}
776+
}
716777
// INTERNAL API
717778

718779
// various recv_* can use a tcp_conn_port can re-use this..
@@ -1256,7 +1317,7 @@ mod test {
12561317
// receive a single new connection.. normally this'd be
12571318
// in a loop {}, but we're just going to take a single
12581319
// client.. get their req, write a resp and then exit
1259-
let new_conn_result = conn_recv(server_port);
1320+
let new_conn_result = server_port.recv();
12601321
if result::is_failure(new_conn_result) {
12611322
let err_data = result::get_err(new_conn_result);
12621323
log(debug, #fmt("SERVER: exited abnormally name %s msg %s",
@@ -1324,7 +1385,7 @@ mod test {
13241385
fn tcp_read_single(sock: tcp_socket)
13251386
-> result::result<[u8],tcp_err_data> {
13261387
log(debug, "starting tcp_read_single");
1327-
let rs_result = read_start(sock);
1388+
let rs_result = sock.read_start();
13281389
if result::is_failure(rs_result) {
13291390
let err_data = result::get_err(rs_result);
13301391
result::err(err_data)
@@ -1345,14 +1406,15 @@ mod test {
13451406
}
13461407
some(data_result) {
13471408
log(debug, "tcp_read_single: got data");
1409+
sock.read_stop();
13481410
data_result
13491411
}
13501412
}
13511413
}
13521414
}
13531415

13541416
fn tcp_write_single(sock: tcp_socket, val: [u8]) {
1355-
let write_result = write(sock, [val]);
1417+
let write_result = sock.write([val]);
13561418
if result::is_failure(write_result) {
13571419
log(debug, "tcp_write_single: write failed!");
13581420
let err_data = result::get_err(write_result);

0 commit comments

Comments
 (0)