Skip to content

Commit 10ff535

Browse files
committed
std: UvFileStream implements HomingIO + .home_for_io() wrapper usage
1 parent c3a819b commit 10ff535

File tree

1 file changed

+60
-39
lines changed

1 file changed

+60
-39
lines changed

src/libstd/rt/uv/uvio.rs

Lines changed: 60 additions & 39 deletions
Original file line numberDiff line numberDiff line change
@@ -460,11 +460,10 @@ impl IoFactory for UvIoFactory {
460460
}
461461

462462
fn fs_from_raw_fd(&mut self, fd: c_int, close_on_drop: bool) -> ~RtioFileStream {
463-
~UvFileStream {
464-
loop_: Loop{handle:self.uv_loop().native_handle()},
465-
fd: file::FileDescriptor(fd),
466-
close_on_drop: close_on_drop,
467-
} as ~RtioFileStream
463+
let loop_ = Loop {handle: self.uv_loop().native_handle()};
464+
let fd = file::FileDescriptor(fd);
465+
let home = get_handle_to_current_scheduler!();
466+
~UvFileStream::new(loop_, fd, close_on_drop, home) as ~RtioFileStream
468467
}
469468

470469
fn fs_open<P: PathLike>(&mut self, path: &P, flags: int, mode: int)
@@ -480,10 +479,11 @@ impl IoFactory for UvIoFactory {
480479
let path = path_cell.take();
481480
do file::FileDescriptor::open(loop_, path, flags, mode) |req,err| {
482481
if err.is_none() {
483-
let res = Ok(~UvFileStream {
484-
loop_: loop_,
485-
fd: file::FileDescriptor(req.get_result()),
486-
close_on_drop: true} as ~RtioFileStream);
482+
let home = get_handle_to_current_scheduler!();
483+
let fd = file::FileDescriptor(req.get_result());
484+
let fs = ~UvFileStream::new(
485+
loop_, fd, true, home) as ~RtioFileStream;
486+
let res = Ok(fs);
487487
unsafe { (*result_cell_ptr).put_back(res); }
488488
let scheduler = Local::take::<Scheduler>();
489489
scheduler.resume_blocked_task_immediately(task_cell.take());
@@ -1061,46 +1061,64 @@ impl RtioTimer for UvTimer {
10611061
pub struct UvFileStream {
10621062
loop_: Loop,
10631063
fd: file::FileDescriptor,
1064-
close_on_drop: bool
1064+
close_on_drop: bool,
1065+
home: SchedHandle
1066+
}
1067+
1068+
impl HomingIO for UvFileStream {
1069+
fn home<'r>(&'r mut self) -> &'r mut SchedHandle { &mut self.home }
10651070
}
10661071

10671072
impl UvFileStream {
1073+
fn new(loop_: Loop, fd: file::FileDescriptor, close_on_drop: bool,
1074+
home: SchedHandle) -> UvFileStream {
1075+
UvFileStream {
1076+
loop_: loop_,
1077+
fd: fd,
1078+
close_on_drop: close_on_drop,
1079+
home: home
1080+
}
1081+
}
10681082
fn base_read(&mut self, buf: &mut [u8], offset: i64) -> Result<int, IoError> {
1069-
let scheduler = Local::take::<Scheduler>();
10701083
let result_cell = Cell::new_empty();
10711084
let result_cell_ptr: *Cell<Result<int, IoError>> = &result_cell;
10721085
let buf_ptr: *&mut [u8] = &buf;
1073-
do scheduler.deschedule_running_task_and_then |_, task| {
1074-
let buf = unsafe { slice_to_uv_buf(*buf_ptr) };
1075-
let task_cell = Cell::new(task);
1076-
do self.fd.read(self.loop_, buf, offset) |req, uverr| {
1077-
let res = match uverr {
1078-
None => Ok(req.get_result() as int),
1079-
Some(err) => Err(uv_error_to_io_error(err))
1086+
do self.home_for_io |self_| {
1087+
let scheduler = Local::take::<Scheduler>();
1088+
do scheduler.deschedule_running_task_and_then |_, task| {
1089+
let buf = unsafe { slice_to_uv_buf(*buf_ptr) };
1090+
let task_cell = Cell::new(task);
1091+
do self_.fd.read(self.loop_, buf, offset) |req, uverr| {
1092+
let res = match uverr {
1093+
None => Ok(req.get_result() as int),
1094+
Some(err) => Err(uv_error_to_io_error(err))
1095+
};
1096+
unsafe { (*result_cell_ptr).put_back(res); }
1097+
let scheduler = Local::take::<Scheduler>();
1098+
scheduler.resume_blocked_task_immediately(task_cell.take());
10801099
};
1081-
unsafe { (*result_cell_ptr).put_back(res); }
1082-
let scheduler = Local::take::<Scheduler>();
1083-
scheduler.resume_blocked_task_immediately(task_cell.take());
10841100
};
10851101
};
10861102
result_cell.take()
10871103
}
10881104
fn base_write(&mut self, buf: &[u8], offset: i64) -> Result<(), IoError> {
1089-
let scheduler = Local::take::<Scheduler>();
10901105
let result_cell = Cell::new_empty();
10911106
let result_cell_ptr: *Cell<Result<(), IoError>> = &result_cell;
10921107
let buf_ptr: *&[u8] = &buf;
1093-
do scheduler.deschedule_running_task_and_then |_, task| {
1094-
let buf = unsafe { slice_to_uv_buf(*buf_ptr) };
1095-
let task_cell = Cell::new(task);
1096-
do self.fd.write(self.loop_, buf, offset) |_, uverr| {
1097-
let res = match uverr {
1098-
None => Ok(()),
1099-
Some(err) => Err(uv_error_to_io_error(err))
1108+
do self.home_for_io |self_| {
1109+
let scheduler = Local::take::<Scheduler>();
1110+
do scheduler.deschedule_running_task_and_then |_, task| {
1111+
let buf = unsafe { slice_to_uv_buf(*buf_ptr) };
1112+
let task_cell = Cell::new(task);
1113+
do self_.fd.write(self.loop_, buf, offset) |_, uverr| {
1114+
let res = match uverr {
1115+
None => Ok(()),
1116+
Some(err) => Err(uv_error_to_io_error(err))
1117+
};
1118+
unsafe { (*result_cell_ptr).put_back(res); }
1119+
let scheduler = Local::take::<Scheduler>();
1120+
scheduler.resume_blocked_task_immediately(task_cell.take());
11001121
};
1101-
unsafe { (*result_cell_ptr).put_back(res); }
1102-
let scheduler = Local::take::<Scheduler>();
1103-
scheduler.resume_blocked_task_immediately(task_cell.take());
11041122
};
11051123
};
11061124
result_cell.take()
@@ -1109,15 +1127,18 @@ impl UvFileStream {
11091127

11101128
impl Drop for UvFileStream {
11111129
fn drop(&self) {
1130+
let self_ = unsafe { transmute::<&UvFileStream, &mut UvFileStream>(self) };
11121131
if self.close_on_drop {
1113-
let scheduler = Local::take::<Scheduler>();
1114-
do scheduler.deschedule_running_task_and_then |_, task| {
1115-
let task_cell = Cell::new(task);
1116-
do self.fd.close(self.loop_) |_,_| {
1117-
let scheduler = Local::take::<Scheduler>();
1118-
scheduler.resume_blocked_task_immediately(task_cell.take());
1132+
do self_.home_for_io |self_| {
1133+
let scheduler = Local::take::<Scheduler>();
1134+
do scheduler.deschedule_running_task_and_then |_, task| {
1135+
let task_cell = Cell::new(task);
1136+
do self_.fd.close(self.loop_) |_,_| {
1137+
let scheduler = Local::take::<Scheduler>();
1138+
scheduler.resume_blocked_task_immediately(task_cell.take());
1139+
};
11191140
};
1120-
};
1141+
}
11211142
}
11221143
}
11231144
}

0 commit comments

Comments
 (0)