1. 10 1月, 2013 1 次提交
    • F
      Check return values from g_poll and select · 5e3bc735
      Fabien Chouteau 提交于
      The current implementation of os_host_main_loop_wait() on Windows,
      returns 1 only when a g_poll() event occurs because the return value of
      select() is overridden. This is wrong as we may skip a socket event, as
      shown in this example:
      
      1. select() returns 0
      2. g_poll() returns 1  (socket event occurs)
      3. os_host_main_loop_wait() returns 1
      4. qemu_iohandler_poll() sees no socket event because select() has
         return before the event occurs
      5. select() returns 1
      6. g_poll() returns 0 (g_poll overrides select's return value)
      7. os_host_main_loop_wait() returns 0
      8. qemu_iohandler_poll() doesn't check for socket events because the
         return value of os_host_main_loop_wait() is zero.
      9. goto 5
      
      This patch use one variable for each of these return values, so we don't
      miss a select() event anymore.
      
      Also move the call to select() after g_poll(), this will improve latency
      as we don't have to go through two os_host_main_loop_wait() calls to
      detect a socket event.
      Reviewed-by: NPaolo Bonzini <pbonzini@redhat.com>
      Signed-off-by: NFabien Chouteau <chouteau@adacore.com>
      Signed-off-by: NAnthony Liguori <aliguori@us.ibm.com>
      5e3bc735
  2. 09 1月, 2013 33 次提交
  3. 08 1月, 2013 6 次提交