@@ -14,7 +14,7 @@ use rt::uv::uvll;
14
14
use rt:: uv:: uvll:: * ;
15
15
use rt:: uv:: { AllocCallback , ConnectionCallback , ReadCallback , UdpReceiveCallback , UdpSendCallback } ;
16
16
use rt:: uv:: { Loop , Watcher , Request , UvError , Buf , NativeHandle , NullCallback ,
17
- status_to_maybe_uv_error} ;
17
+ status_to_maybe_uv_error, vec_to_uv_buf } ;
18
18
use rt:: io:: net:: ip:: { SocketAddr , Ipv4Addr , Ipv6Addr } ;
19
19
use vec;
20
20
use str;
@@ -147,7 +147,18 @@ impl StreamWatcher {
147
147
data. read_cb = Some ( cb) ;
148
148
}
149
149
150
- unsafe { uvll:: read_start ( self . native_handle ( ) , alloc_cb, read_cb) ; }
150
+ let ret = unsafe { uvll:: read_start ( self . native_handle ( ) , alloc_cb, read_cb) } ;
151
+
152
+ if ret != 0 {
153
+ // uvll::read_start failed, so read_cb will not be called.
154
+ // Call it manually for scheduling.
155
+ call_read_cb ( self . native_handle ( ) , ret as ssize_t ) ;
156
+ }
157
+
158
+ fn call_read_cb ( stream : * uvll:: uv_stream_t , errno : ssize_t ) {
159
+ #[ fixed_stack_segment] ; #[ inline( never) ] ;
160
+ read_cb ( stream, errno, vec_to_uv_buf ( ~[ ] ) ) ;
161
+ }
151
162
152
163
extern fn alloc_cb ( stream : * uvll:: uv_stream_t , suggested_size : size_t ) -> Buf {
153
164
let mut stream_watcher: StreamWatcher = NativeHandle :: from_native_handle ( stream) ;
0 commit comments