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@xxxxxxxxxx> > --- > 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