summary refs log tree commit diff
path: root/devices
diff options
context:
space:
mode:
Diffstat (limited to 'devices')
-rw-r--r--devices/src/virtio/wl.rs9
1 files changed, 8 insertions, 1 deletions
diff --git a/devices/src/virtio/wl.rs b/devices/src/virtio/wl.rs
index 32ef2f0..2c34e4e 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));
             }
         }
     }