auto merge of #13638 : alexcrichton/rust/fix-windows-tcp-timeout-bug, r=brson

When a uv_tcp_t is closed in libuv, it will still invoke the pending connect_cb,
and I thought that it would always call it with ECANCELED, but it turns out that
sometimes we'll get a different error code instead. Handle this case by checking
to see if the request's data is NULL and bail out if so (the timeout expired).
This commit is contained in:
bors 2014-04-22 08:41:32 -07:00
commit c03d658f7e

View File

@ -270,7 +270,14 @@ impl TcpWatcher {
let req = Request::wrap(req);
if status == uvll::ECANCELED { return }
let cx: &mut Ctx = unsafe { req.get_data() };
// Apparently on windows when the handle is closed this callback may
// not be invoked with ECANCELED but rather another error code.
// Either ways, if the data is null, then our timeout has expired
// and there's nothing we can do.
let data = unsafe { uvll::get_data_for_req(req.handle) };
if data.is_null() { return }
let cx: &mut Ctx = unsafe { &mut *(data as *mut Ctx) };
cx.status = status;
match cx.timer {
Some(ref mut t) => t.stop(),