@@ -166,8 +166,10 @@ fn ref_handle<T>(hl_loop: high_level_loop, handle: *T) unsafe {
166
166
}
167
167
#[ doc="
168
168
" ]
169
- fn unref_handle < T > ( hl_loop : high_level_loop , handle : * T ) unsafe {
170
- send_high_level_msg ( hl_loop, auto_unref_handle ( handle as * libc:: c_void ) ) ;
169
+ fn unref_handle < T > ( hl_loop : high_level_loop , handle : * T ,
170
+ user_close_cb : * u8 ) unsafe {
171
+ send_high_level_msg ( hl_loop, auto_unref_handle ( handle as * libc:: c_void ,
172
+ user_close_cb) ) ;
171
173
}
172
174
173
175
/////////////////////
@@ -232,8 +234,8 @@ crust fn high_level_wake_up_cb(async_handle: *libc::c_void,
232
234
auto_ref_handle ( handle) {
233
235
high_level_ref ( data, handle) ;
234
236
}
235
- auto_unref_handle ( handle) {
236
- high_level_unref ( data, handle, false ) ;
237
+ auto_unref_handle ( handle, user_close_cb ) {
238
+ high_level_unref ( data, handle, false , user_close_cb ) ;
237
239
}
238
240
tear_down {
239
241
log( debug, "incoming hl_msg: got tear_down" ) ;
@@ -277,12 +279,8 @@ unsafe fn high_level_ref(data: *global_loop_data, handle: *libc::c_void) {
277
279
( * data) . refd_handles = refd_handles;
278
280
}
279
281
280
- crust fn auto_unref_close_cb ( handle : * libc:: c_void ) {
281
- log ( debug, "closing handle via high_level_unref" ) ;
282
- }
283
-
284
282
unsafe fn high_level_unref ( data : * global_loop_data , handle : * libc:: c_void ,
285
- manual_unref : bool ) {
283
+ manual_unref : bool , user_close_cb : * u8 ) {
286
284
log ( debug, "incoming hl_msg: got auto_unref_handle" ) ;
287
285
let mut refd_handles = ( * data) . refd_handles ;
288
286
let mut unrefd_handles = ( * data) . unrefd_handles ;
@@ -299,7 +297,7 @@ unsafe fn high_level_unref(data: *global_loop_data, handle: *libc::c_void,
299
297
}
300
298
}
301
299
else {
302
- ll:: close ( handle, auto_unref_close_cb ) ;
300
+ ll:: close ( handle, user_close_cb ) ;
303
301
let last_idx = vec:: len ( refd_handles) - 1 u;
304
302
let handle_idx = vec:: position_elem ( refd_handles, handle) ;
305
303
alt handle_idx {
@@ -328,7 +326,7 @@ unsafe fn high_level_unref(data: *global_loop_data, handle: *libc::c_void,
328
326
enum high_level_msg {
329
327
interaction ( fn ~( * libc:: c_void) ) ,
330
328
auto_ref_handle ( * libc:: c_void) ,
331
- auto_unref_handle ( * libc:: c_void) ,
329
+ auto_unref_handle ( * libc:: c_void, * u8 ) ,
332
330
tear_down
333
331
}
334
332
@@ -384,8 +382,6 @@ unsafe fn outer_global_loop_body(msg_po: comm::port<high_level_msg>) {
384
382
} ;
385
383
386
384
ll:: loop_delete ( loop_ptr) ;
387
- // once we get here, show's over.
388
- rustrt:: rust_uv_free_kernel_global_async_handle ( ) ;
389
385
}
390
386
391
387
unsafe fn inner_global_loop_body ( weak_exit_po_in : comm:: port < ( ) > ,
@@ -437,22 +433,22 @@ unsafe fn inner_global_loop_body(weak_exit_po_in: comm::port<()>,
437
433
#[ cfg( test) ]
438
434
mod test {
439
435
crust fn simple_timer_close_cb ( timer_ptr : * ll:: uv_timer_t ) unsafe {
440
- log ( debug, "UNUSED..." ) ;
436
+ log ( debug, "user close cb for timer_ptr" ) ;
437
+ let exit_ch_ptr = ll:: get_data_for_uv_handle (
438
+ timer_ptr as * libc:: c_void ) as * comm:: chan < bool > ;
439
+ let exit_ch = * exit_ch_ptr;
440
+ comm:: send ( exit_ch, true ) ;
441
441
}
442
442
crust fn simple_timer_cb ( timer_ptr : * ll:: uv_timer_t ,
443
443
status : libc:: c_int ) unsafe {
444
444
log ( debug, "in simple timer cb" ) ;
445
- let exit_ch_ptr = ll:: get_data_for_uv_handle (
446
- timer_ptr as * libc:: c_void ) as * comm:: chan < bool > ;
447
445
ll:: timer_stop ( timer_ptr) ;
448
446
let hl_loop = get_global_loop ( ) ;
449
447
interact ( hl_loop) { |loop_ptr|
450
448
log ( debug, "closing timer" ) ;
451
449
//ll::close(timer_ptr as *libc::c_void, simple_timer_close_cb);
452
- unref_handle ( hl_loop, timer_ptr) ;
450
+ unref_handle ( hl_loop, timer_ptr, simple_timer_close_cb ) ;
453
451
log ( debug, "about to deref exit_ch_ptr" ) ;
454
- let exit_ch = * exit_ch_ptr;
455
- comm:: send ( exit_ch, true ) ;
456
452
log ( debug, "after msg sent on deref'd exit_ch" ) ;
457
453
} ;
458
454
log ( debug, "exiting simple timer cb" ) ;
0 commit comments