Skip to content

Commit 93ca5eb

Browse files
committed
core::rt: Clean up the interface to rtio
Make names that better match rt::io. Return error types.
1 parent b2fbd34 commit 93ca5eb

File tree

5 files changed

+63
-60
lines changed

5 files changed

+63
-60
lines changed

src/libcore/rt/io/mod.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -238,6 +238,7 @@ Out of scope
238238
* How does I/O relate to the Iterator trait?
239239
* std::base64 filters
240240
* Using conditions is a big unknown since we don't have much experience with them
241+
* Too many uses of OtherIoError
241242
242243
*/
243244

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

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -9,21 +9,22 @@
99
// except according to those terms.
1010

1111
use option::{Option, Some, None};
12-
use result::{Result, Ok, Err};
12+
use result::{Ok, Err};
1313
use ops::Drop;
1414
use rt::sched::local_sched::unsafe_borrow_io;
1515
use rt::io::net::ip::IpAddr;
1616
use rt::io::{Reader, Writer, Listener};
1717
use rt::io::io_error;
18-
use rt::rtio;
19-
use rt::rtio::{IoFactory, TcpListener, Stream};
18+
use rt::rtio::{IoFactory,
19+
RtioTcpListener, RtioTcpListenerObject,
20+
RtioTcpStream, RtioTcpStreamObject};
2021

2122
pub struct TcpStream {
22-
rtstream: ~rtio::StreamObject
23+
rtstream: ~RtioTcpStreamObject
2324
}
2425

2526
impl TcpStream {
26-
fn new(s: ~rtio::StreamObject) -> TcpStream {
27+
fn new(s: ~RtioTcpStreamObject) -> TcpStream {
2728
TcpStream {
2829
rtstream: s
2930
}
@@ -34,7 +35,7 @@ impl TcpStream {
3435
rtdebug!("borrowing io to connect");
3536
let io = unsafe_borrow_io();
3637
rtdebug!("about to connect");
37-
io.connect(addr)
38+
io.tcp_connect(addr)
3839
};
3940

4041
match stream {
@@ -85,12 +86,12 @@ impl Drop for TcpStream {
8586
}
8687

8788
pub struct TcpListener {
88-
rtlistener: ~rtio::TcpListenerObject
89+
rtlistener: ~RtioTcpListenerObject
8990
}
9091

9192
impl TcpListener {
9293
pub fn bind(addr: IpAddr) -> Option<TcpListener> {
93-
let listener = unsafe { unsafe_borrow_io().bind(addr) };
94+
let listener = unsafe { unsafe_borrow_io().tcp_bind(addr) };
9495
match listener {
9596
Ok(l) => {
9697
Some(TcpListener {
@@ -107,12 +108,12 @@ impl TcpListener {
107108

108109
impl Listener<TcpStream> for TcpListener {
109110
fn accept(&mut self) -> Option<TcpStream> {
110-
let rtstream = self.rtlistener.listen();
111+
let rtstream = self.rtlistener.accept();
111112
match rtstream {
112-
Some(s) => {
113+
Ok(s) => {
113114
Some(TcpStream::new(s))
114115
}
115-
None => {
116+
Err(_) => {
116117
abort!("TODO");
117118
}
118119
}

src/libcore/rt/rtio.rs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,8 @@ use super::io::net::ip::IpAddr;
1818
// types to use instead
1919
pub type EventLoopObject = super::uvio::UvEventLoop;
2020
pub type IoFactoryObject = super::uvio::UvIoFactory;
21-
pub type StreamObject = super::uvio::UvStream;
22-
pub type TcpListenerObject = super::uvio::UvTcpListener;
21+
pub type RtioTcpStreamObject = super::uvio::UvTcpStream;
22+
pub type RtioTcpListenerObject = super::uvio::UvTcpListener;
2323

2424
pub trait EventLoop {
2525
fn run(&mut self);
@@ -29,15 +29,15 @@ pub trait EventLoop {
2929
}
3030

3131
pub trait IoFactory {
32-
fn connect(&mut self, addr: IpAddr) -> Result<~StreamObject, IoError>;
33-
fn bind(&mut self, addr: IpAddr) -> Result<~TcpListenerObject, IoError>;
32+
fn tcp_connect(&mut self, addr: IpAddr) -> Result<~RtioTcpStreamObject, IoError>;
33+
fn tcp_bind(&mut self, addr: IpAddr) -> Result<~RtioTcpListenerObject, IoError>;
3434
}
3535

36-
pub trait TcpListener {
37-
fn listen(&mut self) -> Option<~StreamObject>;
36+
pub trait RtioTcpListener {
37+
fn accept(&mut self) -> Result<~RtioTcpStreamObject, IoError>;
3838
}
3939

40-
pub trait Stream {
41-
fn read(&mut self, buf: &mut [u8]) -> Result<uint, ()>;
42-
fn write(&mut self, buf: &[u8]) -> Result<(), ()>;
40+
pub trait RtioTcpStream {
41+
fn read(&mut self, buf: &mut [u8]) -> Result<uint, IoError>;
42+
fn write(&mut self, buf: &[u8]) -> Result<(), IoError>;
4343
}

src/libcore/rt/uv/mod.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,7 @@ use ptr::null;
4848
use unstable::finally::Finally;
4949

5050
use rt::uvll;
51-
use rt::io::{IoError, FileNotFound};
51+
use rt::io::IoError;
5252

5353
#[cfg(test)] use unstable::run_in_bare_thread;
5454

src/libcore/rt/uvio.rs

Lines changed: 40 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -10,19 +10,20 @@
1010

1111
use option::*;
1212
use result::*;
13-
14-
use rt::io::IoError;
15-
use super::io::net::ip::IpAddr;
16-
use super::uv::*;
17-
use super::rtio::*;
1813
use ops::Drop;
1914
use cell::{Cell, empty_cell};
2015
use cast::transmute;
21-
use super::sched::{Scheduler, local_sched};
16+
17+
use rt::io::IoError;
18+
use rt::io::net::ip::IpAddr;
19+
use rt::uv::*;
20+
use rt::rtio::*;
21+
use rt::sched::{Scheduler, local_sched};
22+
use rt::io::{standard_error, OtherIoError};
2223

2324
#[cfg(test)] use uint;
2425
#[cfg(test)] use unstable::run_in_bare_thread;
25-
#[cfg(test)] use super::test::*;
26+
#[cfg(test)] use rt::test::*;
2627

2728
pub struct UvEventLoop {
2829
uvio: UvIoFactory
@@ -99,11 +100,11 @@ impl IoFactory for UvIoFactory {
99100
// Connect to an address and return a new stream
100101
// NB: This blocks the task waiting on the connection.
101102
// It would probably be better to return a future
102-
fn connect(&mut self, addr: IpAddr) -> Result<~StreamObject, IoError> {
103+
fn tcp_connect(&mut self, addr: IpAddr) -> Result<~RtioTcpStreamObject, IoError> {
103104
// Create a cell in the task to hold the result. We will fill
104105
// the cell before resuming the task.
105106
let result_cell = empty_cell();
106-
let result_cell_ptr: *Cell<Result<~StreamObject, IoError>> = &result_cell;
107+
let result_cell_ptr: *Cell<Result<~RtioTcpStreamObject, IoError>> = &result_cell;
107108

108109
let scheduler = local_sched::take();
109110
assert!(scheduler.in_task_context());
@@ -123,7 +124,7 @@ impl IoFactory for UvIoFactory {
123124
rtdebug!("connect: in connect callback");
124125
let maybe_stream = if status.is_none() {
125126
rtdebug!("status is none");
126-
Ok(~UvStream(stream_watcher))
127+
Ok(~UvTcpStream(stream_watcher))
127128
} else {
128129
rtdebug!("status is some");
129130
// XXX: Wait for close
@@ -144,7 +145,7 @@ impl IoFactory for UvIoFactory {
144145
return result_cell.take();
145146
}
146147

147-
fn bind(&mut self, addr: IpAddr) -> Result<~TcpListenerObject, IoError> {
148+
fn tcp_bind(&mut self, addr: IpAddr) -> Result<~RtioTcpListenerObject, IoError> {
148149
let mut watcher = TcpWatcher::new(self.uv_loop());
149150
match watcher.bind(addr) {
150151
Ok(_) => Ok(~UvTcpListener(watcher)),
@@ -177,12 +178,12 @@ impl Drop for UvTcpListener {
177178
}
178179
}
179180

180-
impl TcpListener for UvTcpListener {
181+
impl RtioTcpListener for UvTcpListener {
181182

182-
fn listen(&mut self) -> Option<~StreamObject> {
183+
fn accept(&mut self) -> Result<~RtioTcpStreamObject, IoError> {
183184
rtdebug!("entering listen");
184185
let result_cell = empty_cell();
185-
let result_cell_ptr: *Cell<Option<~StreamObject>> = &result_cell;
186+
let result_cell_ptr: *Cell<Result<~RtioTcpStreamObject, IoError>> = &result_cell;
186187

187188
let server_tcp_watcher = self.watcher();
188189

@@ -199,9 +200,9 @@ impl TcpListener for UvTcpListener {
199200
let client_tcp_watcher = TcpWatcher::new(&mut loop_).as_stream();
200201
// XXX: Needs to be surfaced in interface
201202
server_stream_watcher.accept(client_tcp_watcher);
202-
Some(~UvStream::new(client_tcp_watcher))
203+
Ok(~UvTcpStream::new(client_tcp_watcher))
203204
} else {
204-
None
205+
Err(standard_error(OtherIoError))
205206
};
206207

207208
unsafe { (*result_cell_ptr).put_back(maybe_stream); }
@@ -218,15 +219,15 @@ impl TcpListener for UvTcpListener {
218219
}
219220
}
220221

221-
pub struct UvStream(StreamWatcher);
222+
pub struct UvTcpStream(StreamWatcher);
222223

223-
impl UvStream {
224-
fn new(watcher: StreamWatcher) -> UvStream {
225-
UvStream(watcher)
224+
impl UvTcpStream {
225+
fn new(watcher: StreamWatcher) -> UvTcpStream {
226+
UvTcpStream(watcher)
226227
}
227228

228229
fn watcher(&self) -> StreamWatcher {
229-
match self { &UvStream(w) => w }
230+
match self { &UvTcpStream(w) => w }
230231
}
231232

232233
// XXX: finalize isn't working for ~UvStream???
@@ -236,17 +237,17 @@ impl UvStream {
236237
}
237238
}
238239

239-
impl Drop for UvStream {
240+
impl Drop for UvTcpStream {
240241
fn finalize(&self) {
241242
rtdebug!("closing stream");
242243
//self.watcher().close(||());
243244
}
244245
}
245246

246-
impl Stream for UvStream {
247-
fn read(&mut self, buf: &mut [u8]) -> Result<uint, ()> {
247+
impl RtioTcpStream for UvTcpStream {
248+
fn read(&mut self, buf: &mut [u8]) -> Result<uint, IoError> {
248249
let result_cell = empty_cell();
249-
let result_cell_ptr: *Cell<Result<uint, ()>> = &result_cell;
250+
let result_cell_ptr: *Cell<Result<uint, IoError>> = &result_cell;
250251

251252
let scheduler = local_sched::take();
252253
assert!(scheduler.in_task_context());
@@ -277,7 +278,7 @@ impl Stream for UvStream {
277278
assert!(nread >= 0);
278279
Ok(nread as uint)
279280
} else {
280-
Err(())
281+
Err(standard_error(OtherIoError))
281282
};
282283

283284
unsafe { (*result_cell_ptr).put_back(result); }
@@ -291,9 +292,9 @@ impl Stream for UvStream {
291292
return result_cell.take();
292293
}
293294

294-
fn write(&mut self, buf: &[u8]) -> Result<(), ()> {
295+
fn write(&mut self, buf: &[u8]) -> Result<(), IoError> {
295296
let result_cell = empty_cell();
296-
let result_cell_ptr: *Cell<Result<(), ()>> = &result_cell;
297+
let result_cell_ptr: *Cell<Result<(), IoError>> = &result_cell;
297298
let scheduler = local_sched::take();
298299
assert!(scheduler.in_task_context());
299300
let watcher = self.watcher();
@@ -308,7 +309,7 @@ impl Stream for UvStream {
308309
let result = if status.is_none() {
309310
Ok(())
310311
} else {
311-
Err(())
312+
Err(standard_error(OtherIoError))
312313
};
313314

314315
unsafe { (*result_cell_ptr).put_back(result); }
@@ -328,7 +329,7 @@ fn test_simple_io_no_connect() {
328329
do run_in_newsched_task {
329330
let io = unsafe { local_sched::unsafe_borrow_io() };
330331
let addr = next_test_ip4();
331-
let maybe_chan = io.connect(addr);
332+
let maybe_chan = io.tcp_connect(addr);
332333
assert!(maybe_chan.is_err());
333334
}
334335
}
@@ -342,8 +343,8 @@ fn test_simple_tcp_server_and_client() {
342343
do spawntask_immediately {
343344
unsafe {
344345
let io = local_sched::unsafe_borrow_io();
345-
let mut listener = io.bind(addr).unwrap();
346-
let mut stream = listener.listen().unwrap();
346+
let mut listener = io.tcp_bind(addr).unwrap();
347+
let mut stream = listener.accept().unwrap();
347348
let mut buf = [0, .. 2048];
348349
let nread = stream.read(buf).unwrap();
349350
assert!(nread == 8);
@@ -359,7 +360,7 @@ fn test_simple_tcp_server_and_client() {
359360
do spawntask_immediately {
360361
unsafe {
361362
let io = local_sched::unsafe_borrow_io();
362-
let mut stream = io.connect(addr).unwrap();
363+
let mut stream = io.tcp_connect(addr).unwrap();
363364
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
364365
stream.close();
365366
}
@@ -374,8 +375,8 @@ fn test_read_and_block() {
374375

375376
do spawntask_immediately {
376377
let io = unsafe { local_sched::unsafe_borrow_io() };
377-
let mut listener = io.bind(addr).unwrap();
378-
let mut stream = listener.listen().unwrap();
378+
let mut listener = io.tcp_bind(addr).unwrap();
379+
let mut stream = listener.accept().unwrap();
379380
let mut buf = [0, .. 2048];
380381

381382
let expected = 32;
@@ -412,7 +413,7 @@ fn test_read_and_block() {
412413

413414
do spawntask_immediately {
414415
let io = unsafe { local_sched::unsafe_borrow_io() };
415-
let mut stream = io.connect(addr).unwrap();
416+
let mut stream = io.tcp_connect(addr).unwrap();
416417
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
417418
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
418419
stream.write([0, 1, 2, 3, 4, 5, 6, 7]);
@@ -432,8 +433,8 @@ fn test_read_read_read() {
432433
do spawntask_immediately {
433434
unsafe {
434435
let io = local_sched::unsafe_borrow_io();
435-
let mut listener = io.bind(addr).unwrap();
436-
let mut stream = listener.listen().unwrap();
436+
let mut listener = io.tcp_bind(addr).unwrap();
437+
let mut stream = listener.accept().unwrap();
437438
let mut buf = [1, .. 2048];
438439
let mut total_bytes_written = 0;
439440
while total_bytes_written < MAX {
@@ -447,7 +448,7 @@ fn test_read_read_read() {
447448

448449
do spawntask_immediately {
449450
let io = unsafe { local_sched::unsafe_borrow_io() };
450-
let mut stream = io.connect(addr).unwrap();
451+
let mut stream = io.tcp_connect(addr).unwrap();
451452
let mut buf = [0, .. 2048];
452453
let mut total_bytes_read = 0;
453454
while total_bytes_read < MAX {

0 commit comments

Comments
 (0)