about summary refs log tree commit diff
path: root/src/libstd
diff options
context:
space:
mode:
authorBrian Anderson <banderson@mozilla.com>2013-07-09 16:54:48 -0700
committerBrian Anderson <banderson@mozilla.com>2013-07-09 16:54:56 -0700
commit413d51e32debf0c3f7dda2434b64d73585df21ef (patch)
tree793f88f8b776c2d32833f26b5190fdadc8dd1917 /src/libstd
parent6fb92f8cab03824a52da6ad23060fe791928dcc9 (diff)
downloadrust-413d51e32debf0c3f7dda2434b64d73585df21ef.tar.gz
rust-413d51e32debf0c3f7dda2434b64d73585df21ef.zip
std::rt: Ignore 0-byte udp reads
Diffstat (limited to 'src/libstd')
-rw-r--r--src/libstd/rt/uv/net.rs7
1 files changed, 7 insertions, 0 deletions
diff --git a/src/libstd/rt/uv/net.rs b/src/libstd/rt/uv/net.rs
index b7caba849b7..6d096f9885a 100644
--- a/src/libstd/rt/uv/net.rs
+++ b/src/libstd/rt/uv/net.rs
@@ -392,6 +392,13 @@ impl UdpWatcher {
 
         extern fn recv_cb(handle: *uvll::uv_udp_t, nread: ssize_t, buf: Buf,
                           addr: *uvll::sockaddr, flags: c_uint) {
+            // When there's no data to read the recv callback can be a no-op.
+            // This can happen if read returns EAGAIN/EWOULDBLOCK. By ignoring
+            // this we just drop back to kqueue and wait for the next callback.
+            if nread == 0 {
+                return;
+            }
+
             rtdebug!("buf addr: %x", buf.base as uint);
             rtdebug!("buf len: %d", buf.len as int);
             let mut udp_watcher: UdpWatcher = NativeHandle::from_native_handle(handle);