@@ -460,11 +460,10 @@ impl IoFactory for UvIoFactory {
460
460
}
461
461
462
462
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
468
467
}
469
468
470
469
fn fs_open < P : PathLike > ( & mut self , path : & P , flags : int , mode : int )
@@ -480,10 +479,11 @@ impl IoFactory for UvIoFactory {
480
479
let path = path_cell. take ( ) ;
481
480
do file:: FileDescriptor :: open ( loop_, path, flags, mode) |req, err| {
482
481
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) ;
487
487
unsafe { ( * result_cell_ptr) . put_back ( res) ; }
488
488
let scheduler = Local :: take :: < Scheduler > ( ) ;
489
489
scheduler. resume_blocked_task_immediately ( task_cell. take ( ) ) ;
@@ -1061,46 +1061,64 @@ impl RtioTimer for UvTimer {
1061
1061
pub struct UvFileStream {
1062
1062
loop_ : Loop ,
1063
1063
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 }
1065
1070
}
1066
1071
1067
1072
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
+ }
1068
1082
fn base_read ( & mut self , buf : & mut [ u8 ] , offset : i64 ) -> Result < int , IoError > {
1069
- let scheduler = Local :: take :: < Scheduler > ( ) ;
1070
1083
let result_cell = Cell :: new_empty ( ) ;
1071
1084
let result_cell_ptr: * Cell < Result < int , IoError > > = & result_cell;
1072
1085
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 ( ) ) ;
1080
1099
} ;
1081
- unsafe { ( * result_cell_ptr) . put_back ( res) ; }
1082
- let scheduler = Local :: take :: < Scheduler > ( ) ;
1083
- scheduler. resume_blocked_task_immediately ( task_cell. take ( ) ) ;
1084
1100
} ;
1085
1101
} ;
1086
1102
result_cell. take ( )
1087
1103
}
1088
1104
fn base_write ( & mut self , buf : & [ u8 ] , offset : i64 ) -> Result < ( ) , IoError > {
1089
- let scheduler = Local :: take :: < Scheduler > ( ) ;
1090
1105
let result_cell = Cell :: new_empty ( ) ;
1091
1106
let result_cell_ptr: * Cell < Result < ( ) , IoError > > = & result_cell;
1092
1107
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 ( ) ) ;
1100
1121
} ;
1101
- unsafe { ( * result_cell_ptr) . put_back ( res) ; }
1102
- let scheduler = Local :: take :: < Scheduler > ( ) ;
1103
- scheduler. resume_blocked_task_immediately ( task_cell. take ( ) ) ;
1104
1122
} ;
1105
1123
} ;
1106
1124
result_cell. take ( )
@@ -1109,15 +1127,18 @@ impl UvFileStream {
1109
1127
1110
1128
impl Drop for UvFileStream {
1111
1129
fn drop ( & self ) {
1130
+ let self_ = unsafe { transmute :: < & UvFileStream , & mut UvFileStream > ( self ) } ;
1112
1131
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
+ } ;
1119
1140
} ;
1120
- } ;
1141
+ }
1121
1142
}
1122
1143
}
1123
1144
}
0 commit comments