Created
September 14, 2015 22:00
-
-
Save anonymous/fdfe95117fb79bef31f1 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/src/sys/windows/tcp.rs b/src/sys/windows/tcp.rs | |
index 3e61c30..c410852 100644 | |
--- a/src/sys/windows/tcp.rs | |
+++ b/src/sys/windows/tcp.rs | |
@@ -237,6 +237,18 @@ impl StreamImp { | |
} | |
} | |
} | |
+ | |
+ /// Pushes an event for this socket onto the selector its registered for. | |
+ /// | |
+ /// When an event is generated on this socket, if it happened after the | |
+ /// socket was closed then we don't want to actually push the event onto our | |
+ /// selector as otherwise it's just a spurious notification. | |
+ fn push(&self, me: &mut StreamInner, set: EventSet, | |
+ into: &mut Vec<IoEvent>) { | |
+ if me.socket.as_raw_socket() != INVALID_SOCKET { | |
+ me.iocp.push_event(set, into); | |
+ } | |
+ } | |
} | |
fn read_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
@@ -259,14 +271,14 @@ fn read_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
if status.bytes_transferred() == 0 { | |
e = e | EventSet::hup(); | |
} | |
- return me.iocp.push_event(e, dst) | |
+ return me2.push(&mut me, e, dst) | |
} | |
s => me.read = s, | |
} | |
// If a read didn't complete, then the connect must have just finished. | |
trace!("finished a connect"); | |
- me.iocp.push_event(EventSet::writable(), dst); | |
+ me2.push(&mut me, EventSet::writable(), dst); | |
me2.schedule_read(&mut me); | |
} | |
@@ -282,7 +294,7 @@ fn write_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
}; | |
let new_pos = pos + (status.bytes_transferred() as usize); | |
if new_pos == buf.len() { | |
- me.iocp.push_event(EventSet::writable(), dst); | |
+ me2.push(&mut me, EventSet::writable(), dst); | |
} else { | |
me2.schedule_write(buf, new_pos, &mut me); | |
} | |
@@ -484,6 +496,14 @@ impl ListenerImp { | |
} | |
} | |
} | |
+ | |
+ // See comments in StreamImp::push | |
+ fn push(&self, me: &mut ListenerInner, set: EventSet, | |
+ into: &mut Vec<IoEvent>) { | |
+ if me.socket.as_raw_socket() != INVALID_SOCKET { | |
+ me.iocp.push_event(set, into); | |
+ } | |
+ } | |
} | |
fn accept_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
@@ -498,7 +518,7 @@ fn accept_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
}; | |
trace!("finished an accept"); | |
me.accept = State::Ready(socket); | |
- me.iocp.push_event(EventSet::readable(), dst); | |
+ me2.push(&mut me, EventSet::readable(), dst); | |
} | |
impl Evented for TcpListener { | |
diff --git a/src/sys/windows/udp.rs b/src/sys/windows/udp.rs | |
index da1639f..23fae29 100644 | |
--- a/src/sys/windows/udp.rs | |
+++ b/src/sys/windows/udp.rs | |
@@ -277,6 +277,14 @@ impl Imp { | |
} | |
} | |
} | |
+ | |
+ // See comments in tcp::StreamImp::push | |
+ fn push(&self, me: &mut Inner, set: EventSet, into: &mut Vec<IoEvent>) { | |
+ if let Socket::Empty = me.socket { | |
+ return | |
+ } | |
+ me.iocp.push_event(set, into); | |
+ } | |
} | |
impl Evented for UdpSocket { | |
@@ -354,7 +362,7 @@ fn send_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
}; | |
let mut me = me2.inner(); | |
me.write = State::Empty; | |
- me.iocp.push_event(EventSet::writable(), dst); | |
+ me2.push(&mut me, EventSet::writable(), dst); | |
} | |
fn recv_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
@@ -371,5 +379,5 @@ fn recv_done(status: &CompletionStatus, dst: &mut Vec<IoEvent>) { | |
buf.set_len(status.bytes_transferred() as usize); | |
} | |
me.read = State::Ready(buf); | |
- me.iocp.push_event(EventSet::readable(), dst); | |
+ me2.push(&mut me, EventSet::readable(), dst); | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment