"Daniel P. Berrange" <berrange@xxxxxxxxxx> wrote: > When going into the call() method, we temporarily disable the > event wakup callback. The call() method is already processing > any async messages which arrive, so letting the main event loop > wakup here is inefficient, and indeed will block the main event > loop on the mutex while the main thread is in call(). We really > don't want that ! > > remote_internal.c | 42 ++++++++++++++++++++++++++++++++++-------- > 1 file changed, 34 insertions(+), 8 deletions(-) > > Daniel > > diff --git a/src/remote_internal.c b/src/remote_internal.c ... > +doCall (virConnectPtr conn, struct private_data *priv, ... > +static int > +call (virConnectPtr conn, struct private_data *priv, > + int flags /* if we are in virConnectOpen */, > + int proc_nr, > + xdrproc_t args_filter, char *args, > + xdrproc_t ret_filter, char *ret) > +{ > + int rv; > + /* > + * Avoid needless wake-ups of the event loop in the > + * case where this call is being made from a different > + * thread than the event loop. These wake-ups would > + * cause the event loop thread to be blocked on the > + * mutex for the duration of the call > + */ > + if (priv->watch >= 0) > + virEventUpdateHandle(priv->watch, 0); > + > + rv = doCall(conn, priv,flags, proc_nr, > + args_filter, args, > + ret_filter, ret); > + > + if (priv->watch >= 0) > + virEventUpdateHandle(priv->watch, VIR_EVENT_HANDLE_READABLE); Looks fine. ACK. At first I wondered if someday the incoming event-update-handle type might be something other than VIR_EVENT_HANDLE_READABLE, in which case you'd want to save the original before doCall, and restore it afterward. Probably won't happen. -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list