11
11
use prelude:: * ;
12
12
use libc:: { size_t, ssize_t, c_int, c_void} ;
13
13
use cast:: transmute_mut_region;
14
+ use util:: ignore;
14
15
use rt:: uv:: uvll;
15
16
use rt:: uv:: uvll:: * ;
16
17
use super :: { Loop , Watcher , Request , UvError , Buf , Callback , NativeHandle , NullCallback ,
17
18
loop_from_watcher, status_to_maybe_uv_error,
18
19
install_watcher_data, get_watcher_data, drop_watcher_data,
19
- vec_to_uv_buf, vec_from_uv_buf} ;
20
+ vec_to_uv_buf, vec_from_uv_buf, slice_to_uv_buf } ;
20
21
use super :: super :: io:: net:: ip:: { IpAddr , Ipv4 , Ipv6 } ;
21
22
use rt:: uv:: last_uv_error;
22
23
@@ -99,17 +100,13 @@ pub impl StreamWatcher {
99
100
unsafe { uvll:: read_stop ( handle) ; }
100
101
}
101
102
102
- // XXX: Needs to take &[u8], not ~[u8]
103
- fn write ( & mut self , msg : ~[ u8 ] , cb : ConnectionCallback ) {
103
+ fn write ( & mut self , buf : Buf , cb : ConnectionCallback ) {
104
104
// XXX: Borrowck
105
105
let data = get_watcher_data ( unsafe { transmute_mut_region ( self ) } ) ;
106
106
assert ! ( data. write_cb. is_none( ) ) ;
107
107
data. write_cb = Some ( cb) ;
108
108
109
109
let req = WriteRequest :: new ( ) ;
110
- let buf = vec_to_uv_buf ( msg) ;
111
- assert ! ( data. buf. is_none( ) ) ;
112
- data. buf = Some ( buf) ;
113
110
let bufs = [ buf] ;
114
111
unsafe {
115
112
assert ! ( 0 == uvll:: write( req. native_handle( ) ,
@@ -123,7 +120,6 @@ pub impl StreamWatcher {
123
120
write_request. delete ( ) ;
124
121
let cb = {
125
122
let data = get_watcher_data ( & mut stream_watcher) ;
126
- let _vec = vec_from_uv_buf ( data. buf . swap_unwrap ( ) ) ;
127
123
let cb = data. write_cb . swap_unwrap ( ) ;
128
124
cb
129
125
} ;
@@ -434,10 +430,13 @@ fn listen() {
434
430
assert!(status.is_none());
435
431
let mut stream_watcher = stream_watcher;
436
432
let msg = ~[0, 1, 2, 3, 4, 5, 6 ,7 ,8, 9];
437
- do stream_watcher.write(msg) |stream_watcher, status| {
433
+ let buf = slice_to_uv_buf(msg);
434
+ let msg_cell = Cell(msg);
435
+ do stream_watcher.write(buf) |stream_watcher, status| {
438
436
rtdebug!(" writing" ) ;
439
437
assert ! ( status. is_none( ) ) ;
440
- stream_watcher. close ( ||( ) ) ;
438
+ let msg_cell = Cell ( msg_cell. take ( ) ) ;
439
+ stream_watcher. close ( ||ignore ( msg_cell. take ( ) ) ) ;
441
440
}
442
441
}
443
442
loop_. run ( ) ;
0 commit comments