Skip to content

Commit e02a87d

Browse files
committed
---
yaml --- r: 61357 b: refs/heads/try c: 174ec1e h: refs/heads/master i: 61355: 2f6e35f v: v3
1 parent 6b45158 commit e02a87d

File tree

7 files changed

+94
-12
lines changed

7 files changed

+94
-12
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@
22
refs/heads/master: 2d28d645422c1617be58c8ca7ad9a457264ca850
33
refs/heads/snap-stage1: e33de59e47c5076a89eadeb38f4934f58a3618a6
44
refs/heads/snap-stage3: 2d28d645422c1617be58c8ca7ad9a457264ca850
5-
refs/heads/try: 0a54bad3d1d306845b04f146c2c31d4a70e9ede3
5+
refs/heads/try: 174ec1e42252c46cc6722296379968ba7a6c6fbd
66
refs/tags/release-0.1: 1f5c5126e96c79d22cb7862f75304136e204f105
77
refs/heads/ndm: f3868061cd7988080c30d6d5bf352a5a5fe2460b
88
refs/heads/try2: 147ecfdd8221e4a4d4e090486829a06da1e0ca3c

branches/try/src/libcore/macros.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@
1111
#[macro_escape];
1212

1313
// Some basic logging
14-
macro_rules! rtdebug_ (
14+
macro_rules! rtdebug (
1515
($( $arg:expr),+) => ( {
1616
dumb_println(fmt!( $($arg),+ ));
1717

@@ -26,7 +26,7 @@ macro_rules! rtdebug_ (
2626
)
2727

2828
// An alternate version with no output, for turning off logging
29-
macro_rules! rtdebug (
29+
macro_rules! rtdebug_ (
3030
($( $arg:expr),+) => ( $(let _ = $arg)*; )
3131
)
3232

branches/try/src/libcore/rt/io/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -338,6 +338,7 @@ pub enum IoErrorKind {
338338
ConnectionFailed,
339339
Closed,
340340
ConnectionRefused,
341+
ConnectionReset
341342
}
342343

343344
// XXX: Can't put doc comments on macros

branches/try/src/libcore/rt/io/net/tcp.rs

Lines changed: 82 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,7 @@ use result::{Ok, Err};
1313
use rt::sched::local_sched::unsafe_borrow_io;
1414
use rt::io::net::ip::IpAddr;
1515
use rt::io::{Reader, Writer, Listener};
16-
use rt::io::io_error;
16+
use rt::io::{io_error, EndOfFile};
1717
use rt::rtio::{IoFactory,
1818
RtioTcpListener, RtioTcpListenerObject,
1919
RtioTcpStream, RtioTcpStreamObject};
@@ -55,8 +55,12 @@ impl Reader for TcpStream {
5555
let bytes_read = self.rtstream.read(buf);
5656
match bytes_read {
5757
Ok(read) => Some(read),
58-
Err(_) => {
59-
abort!("XXX");
58+
Err(ioerr) => {
59+
// EOF is indicated by returning None
60+
if ioerr.kind != EndOfFile {
61+
io_error::cond.raise(ioerr);
62+
}
63+
return None;
6064
}
6165
}
6266
}
@@ -69,8 +73,8 @@ impl Writer for TcpStream {
6973
let res = self.rtstream.write(buf);
7074
match res {
7175
Ok(_) => (),
72-
Err(_) => {
73-
abort!("XXX");
76+
Err(ioerr) => {
77+
io_error::cond.raise(ioerr);
7478
}
7579
}
7680
}
@@ -106,8 +110,9 @@ impl Listener<TcpStream> for TcpListener {
106110
Ok(s) => {
107111
Some(TcpStream::new(s))
108112
}
109-
Err(_) => {
110-
abort!("XXX");
113+
Err(ioerr) => {
114+
io_error::cond.raise(ioerr);
115+
return None;
111116
}
112117
}
113118
}
@@ -174,6 +179,76 @@ mod test {
174179
}
175180
}
176181

182+
#[test]
183+
fn read_eof() {
184+
do run_in_newsched_task {
185+
let addr = next_test_ip4();
186+
187+
do spawntask_immediately {
188+
let mut listener = TcpListener::bind(addr);
189+
let mut stream = listener.accept();
190+
let mut buf = [0];
191+
let nread = stream.read(buf);
192+
assert!(nread.is_none());
193+
}
194+
195+
do spawntask_immediately {
196+
let _stream = TcpStream::connect(addr);
197+
// Close
198+
}
199+
}
200+
}
201+
202+
#[test]
203+
fn read_eof_twice() {
204+
do run_in_newsched_task {
205+
let addr = next_test_ip4();
206+
207+
do spawntask_immediately {
208+
let mut listener = TcpListener::bind(addr);
209+
let mut stream = listener.accept();
210+
let mut buf = [0];
211+
let nread = stream.read(buf);
212+
assert!(nread.is_none());
213+
let nread = stream.read(buf);
214+
assert!(nread.is_none());
215+
}
216+
217+
do spawntask_immediately {
218+
let _stream = TcpStream::connect(addr);
219+
// Close
220+
}
221+
}
222+
}
223+
224+
#[test]
225+
fn write_close() {
226+
do run_in_newsched_task {
227+
let addr = next_test_ip4();
228+
229+
do spawntask_immediately {
230+
let mut listener = TcpListener::bind(addr);
231+
let mut stream = listener.accept();
232+
let buf = [0];
233+
loop {
234+
let mut stop = false;
235+
do io_error::cond.trap(|e| {
236+
assert!(e.kind == ConnectionReset);
237+
stop = true;
238+
}).in {
239+
stream.write(buf);
240+
}
241+
if stop { break }
242+
}
243+
}
244+
245+
do spawntask_immediately {
246+
let stream = TcpStream::connect(addr);
247+
// Close
248+
}
249+
}
250+
}
251+
177252
#[test]
178253
fn multiple_connect_serial() {
179254
do run_in_newsched_task {

branches/try/src/libcore/rt/uv/mod.rs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -210,6 +210,10 @@ pub impl UvError {
210210
from_c_str(desc_str)
211211
}
212212
}
213+
214+
fn is_eof(&self) -> bool {
215+
self.code == uvll::EOF
216+
}
213217
}
214218

215219
impl ToStr for UvError {
@@ -262,6 +266,7 @@ pub fn uv_error_to_io_error(uverr: UvError) -> IoError {
262266
EOF => EndOfFile,
263267
EACCES => PermissionDenied,
264268
ECONNREFUSED => ConnectionRefused,
269+
ECONNRESET => ConnectionReset,
265270
e => {
266271
abort!("unknown uv error code: %u", e as uint);
267272
}

branches/try/src/libcore/rt/uv/uvio.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -301,7 +301,7 @@ impl RtioTcpStream for UvTcpStream {
301301
assert!(nread >= 0);
302302
Ok(nread as uint)
303303
} else {
304-
Err(standard_error(OtherIoError))
304+
Err(uv_error_to_io_error(status.unwrap()))
305305
};
306306

307307
unsafe { (*result_cell_ptr).put_back(result); }
@@ -330,7 +330,7 @@ impl RtioTcpStream for UvTcpStream {
330330
let result = if status.is_none() {
331331
Ok(())
332332
} else {
333-
Err(standard_error(OtherIoError))
333+
Err(uv_error_to_io_error(status.unwrap()))
334334
};
335335

336336
unsafe { (*result_cell_ptr).put_back(result); }

branches/try/src/libcore/rt/uv/uvll.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,7 @@ pub static EOF: c_int = 1;
3939
pub static EADDRINFO: c_int = 2;
4040
pub static EACCES: c_int = 3;
4141
pub static ECONNREFUSED: c_int = 12;
42+
pub static ECONNRESET: c_int = 13;
4243

4344
pub struct uv_err_t {
4445
code: c_int,

0 commit comments

Comments
 (0)