
On 5. 3. 2020 13:51, Daniel P. Berrangé wrote:
This converts the QEMU agent APIs to use the per-VM event loop, which involves switching from virEvent APIs to GMainContext / GSource APIs.
A GSocket is used as a convenient way to create a GSource for a socket, but is not yet used for actual I/O.
Signed-off-by: Daniel P. Berrangé <berrange@redhat.com> --- src/qemu/qemu_agent.c | 146 +++++++++++++++++++---------------- src/qemu/qemu_agent.h | 1 + src/qemu/qemu_process.c | 1 + tests/qemumonitortestutils.c | 1 + 4 files changed, 84 insertions(+), 65 deletions(-)
@@ -498,28 +496,62 @@ qemuAgentIORead(qemuAgentPtr agent) }
-static void qemuAgentUpdateWatch(qemuAgentPtr agent) -{ - int events = - VIR_EVENT_HANDLE_HANGUP | - VIR_EVENT_HANDLE_ERROR; +static gboolean +qemuAgentIO(GSocket *socket, + GIOCondition cond, + gpointer opaque);
- if (!agent->watch) - return; + +static void +qemuAgentRegister(qemuAgentPtr agent) +{ + GIOCondition cond = 0;
if (agent->lastError.code == VIR_ERR_OK) { - events |= VIR_EVENT_HANDLE_READABLE; + cond |= G_IO_IN;
if (agent->msg && agent->msg->txOffset < agent->msg->txLength) - events |= VIR_EVENT_HANDLE_WRITABLE; + cond |= G_IO_OUT; }
- virEventUpdateHandle(agent->watch, events); + agent->watch = g_socket_create_source(agent->socket, + cond, + NULL); + + virObjectRef(agent); + g_source_set_callback(agent->watch, + (GSourceFunc)qemuAgentIO, + agent, + NULL);
And again, this needs to be "(GDestroyNotify) virObjectUnref" instead of NULL. Michal