@@ -66,7 +66,7 @@ impl EventLoop for UvEventLoop {
66
66
assert ! ( status. is_none( ) ) ;
67
67
let mut idle_watcher = idle_watcher;
68
68
idle_watcher. stop ( ) ;
69
- idle_watcher. close ( ) ;
69
+ idle_watcher. close ( || ( ) ) ;
70
70
f ( ) ;
71
71
}
72
72
}
@@ -124,22 +124,26 @@ impl IoFactory for UvIoFactory {
124
124
// Wait for a connection
125
125
do tcp_watcher. connect ( addr) |stream_watcher, status| {
126
126
rtdebug ! ( "connect: in connect callback" ) ;
127
- let maybe_stream = if status. is_none ( ) {
127
+ if status. is_none ( ) {
128
128
rtdebug ! ( "status is none" ) ;
129
- Ok ( ~UvTcpStream { watcher : stream_watcher } )
129
+ let res = Ok ( ~UvTcpStream { watcher : stream_watcher } ) ;
130
+
131
+ // Store the stream in the task's stack
132
+ unsafe { ( * result_cell_ptr) . put_back ( res) ; }
133
+
134
+ // Context switch
135
+ let scheduler = local_sched:: take ( ) ;
136
+ scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
130
137
} else {
131
138
rtdebug ! ( "status is some" ) ;
132
- // XXX: Wait for close
133
- stream_watcher. close ( ||( ) ) ;
134
- Err ( uv_error_to_io_error ( status. get ( ) ) )
139
+ let task_cell = Cell ( task_cell. take ( ) ) ;
140
+ do stream_watcher. close {
141
+ let res = Err ( uv_error_to_io_error ( status. get ( ) ) ) ;
142
+ unsafe { ( * result_cell_ptr) . put_back ( res) ; }
143
+ let scheduler = local_sched:: take ( ) ;
144
+ scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
145
+ }
135
146
} ;
136
-
137
- // Store the stream in the task's stack
138
- unsafe { ( * result_cell_ptr) . put_back ( maybe_stream) ; }
139
-
140
- // Context switch
141
- let scheduler = local_sched:: take ( ) ;
142
- scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
143
147
}
144
148
}
145
149
@@ -152,8 +156,14 @@ impl IoFactory for UvIoFactory {
152
156
match watcher. bind ( addr) {
153
157
Ok ( _) => Ok ( ~UvTcpListener :: new ( watcher) ) ,
154
158
Err ( uverr) => {
155
- // XXX: Should we wait until close completes?
156
- watcher. as_stream ( ) . close ( ||( ) ) ;
159
+ let scheduler = local_sched:: take ( ) ;
160
+ do scheduler. deschedule_running_task_and_then |task| {
161
+ let task_cell = Cell ( task) ;
162
+ do watcher. as_stream ( ) . close {
163
+ let scheduler = local_sched:: take ( ) ;
164
+ scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
165
+ }
166
+ }
157
167
Err ( uv_error_to_io_error ( uverr) )
158
168
}
159
169
}
@@ -181,8 +191,15 @@ impl UvTcpListener {
181
191
182
192
impl Drop for UvTcpListener {
183
193
fn finalize ( & self ) {
184
- // XXX: Need to wait until close finishes before returning
185
- self . watcher ( ) . as_stream ( ) . close ( ||( ) ) ;
194
+ let watcher = self . watcher ( ) ;
195
+ let scheduler = local_sched:: take ( ) ;
196
+ do scheduler. deschedule_running_task_and_then |task| {
197
+ let task_cell = Cell ( task) ;
198
+ do watcher. as_stream ( ) . close {
199
+ let scheduler = local_sched:: take ( ) ;
200
+ scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
201
+ }
202
+ }
186
203
}
187
204
}
188
205
@@ -235,8 +252,16 @@ impl UvTcpStream {
235
252
236
253
impl Drop for UvTcpStream {
237
254
fn finalize ( & self ) {
238
- rtdebug ! ( "closing stream" ) ;
239
- self . watcher ( ) . close ( ||( ) ) ;
255
+ rtdebug ! ( "closing tcp stream" ) ;
256
+ let watcher = self . watcher ( ) ;
257
+ let scheduler = local_sched:: take ( ) ;
258
+ do scheduler. deschedule_running_task_and_then |task| {
259
+ let task_cell = Cell ( task) ;
260
+ do watcher. close {
261
+ let scheduler = local_sched:: take ( ) ;
262
+ scheduler. resume_task_immediately ( task_cell. take ( ) ) ;
263
+ }
264
+ }
240
265
}
241
266
}
242
267
0 commit comments