Răsfoiți Sursa

Peek before popping.

Only try to pop if the token we expect is next on the used queue.
Andrew Walbran 2 ani în urmă
părinte
comite
006c961f0c
1 a modificat fișierele cu 8 adăugiri și 8 ștergeri
  1. 8 8
      src/device/console.rs

+ 8 - 8
src/device/console.rs

@@ -127,33 +127,33 @@ impl<H: Hal, T: Transport> VirtIOConsole<'_, H, T> {
             return Ok(false);
         }
 
-        Ok(self.finish_receive())
+        self.finish_receive()
     }
 
     /// If there is an outstanding receive request and it has finished, completes it.
     ///
     /// Returns true if new data has been received.
-    fn finish_receive(&mut self) -> bool {
+    fn finish_receive(&mut self) -> Result<bool> {
         let mut flag = false;
         if let Some(receive_token) = self.receive_token {
-            if let Ok(len) = self
-                .receiveq
-                .pop_used(receive_token, &[], &[self.queue_buf_rx])
-            {
+            if self.receive_token == self.receiveq.peek_used() {
+                let len = self
+                    .receiveq
+                    .pop_used(receive_token, &[], &[self.queue_buf_rx])?;
                 flag = true;
                 assert_ne!(len, 0);
                 self.cursor = 0;
                 self.pending_len = len as usize;
             }
         }
-        flag
+        Ok(flag)
     }
 
     /// Returns the next available character from the console, if any.
     ///
     /// If no data has been received this will not block but immediately return `Ok<None>`.
     pub fn recv(&mut self, pop: bool) -> Result<Option<u8>> {
-        self.finish_receive();
+        self.finish_receive()?;
         if self.cursor == self.pending_len {
             return Ok(None);
         }