From 71aedde5af253e435c351da42b40c1e9c16df8c0 Mon Sep 17 00:00:00 2001 From: Zach Reizner Date: Thu, 26 Apr 2018 13:44:11 -0700 Subject: [PATCH] wl: send HUP event when VFDs are hungup It is essential that paste operations on the guest receive a hangup letting them know that there is no more data to read. This change fixes that behavior, which was broken by thew new PollContext based logic, which separates out the readable and hungup code paths. TEST=finished wayland pastes receive EOF BUG=chromium:835112 Change-Id: I764124ab2eabb32d8cc25a3a4c0dfbe49b26e799 Reviewed-on: https://chromium-review.googlesource.com/1031292 Commit-Ready: Zach Reizner Tested-by: David Reveman Reviewed-by: David Reveman Reviewed-by: Stephen Barber Reviewed-by: Dylan Reid --- devices/src/virtio/wl.rs | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs index 32ef2f05c9..2c34e4e95a 100644 --- a/devices/src/virtio/wl.rs +++ b/devices/src/virtio/wl.rs @@ -838,9 +838,16 @@ impl WlState { for event in events.as_ref().iter_hungup() { if !event.readable() { - if let Err(e) = self.close(event.token()) { + let vfd_id = event.token(); + if let Err(e) = self.close(vfd_id) { warn!("failed to close vfd: {:?}", e) } + // Once the vfd has been hungup and there is nothing left to read, it's time to send + // the HUP event over virtio. It's very important that this in_queue entry gets + // pushed /after/ we self.close the vfd_id because part of the close operation for a + // vfd is removing all pending in_queue entries related to the vfd, regardless of + // type. + self.in_queue.push_back((vfd_id, WlRecv::Hup)); } } }