
By setting vm->status to PAUSED before actually sending the request to qemu (and resetting it back if the request fails) we can ignore the event since the event handler does nothing when the guest is already paused. This solution is quite hacky but unfortunately it's the best solution which I was able to come up with and it doesn't introduce a race condition.
You could extend the low-level driver to accept a mask of events to be ignored.
The core problem here is that QEMU only emits a STOP event, with no corresponding CONT event. If QEMU had been doing both, this patch would not be neccessary, because we'd see both transitions from QEMU instead of just one direction.
Actually, I don't think CONT event would help in this case. When libvirt is issuing a command to stop qemu emulation, it knows if it failed or succeeded synchronously and may set guest's state appropriately. Having asynchronously processed handler of STOP/CONT event set the guest state is not a good idea. We dealt with code written in such a way before and I guess no-one wants to get back to it :-) So I think we will eventually need to introduce event mask into monitor code. Jirka