Skip to content

Instantly share code, notes, and snippets.

Created September 14, 2015 22:00
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save anonymous/fdfe95117fb79bef31f1 to your computer and use it in GitHub Desktop.
Save anonymous/fdfe95117fb79bef31f1 to your computer and use it in GitHub Desktop.
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