On 12/18/23 13:23, Daniel P. Berrangé wrote: > The first thread to issue a client RPC request will own the event > loop execution, sitting in the virNetClientIOEventLoop function. > > It releases the client lock while running: > > virNetClientUnlock() > g_main_loop_run() > virNetClientLock() > > If a second thread arrives with an RPC request, it will queue it > for the first thread to process. To inform the first thread that > there's a new request it calls g_main_loop_quit() to break it out > of the main loop. > > This works if the first thread is in g_main_loop_run() at that > time. There is a small window of opportunity, however, where > the first thread has released the client lock, but not yet got > into g_main_loop_run(). If that happens, the wakeup from the > second thread is lost. > > This patch deals with that by changing the way the wakeup is > performed. Instead of directly calling g_main_loop_quit(), the > second thread creates an idle source to run the quit function > from within the first thread. This guarantees that the first > thread will see the wakeup. > > Signed-off-by: Daniel P. Berrangé <berrange@xxxxxxxxxx> > --- > > src/rpc/virnetclient.c | 13 ++++++++++++- > 1 file changed, 12 insertions(+), 1 deletion(-) > Reviewed-by: Michal Privoznik <mprivozn@xxxxxxxxxx> Michal _______________________________________________ Devel mailing list -- devel@xxxxxxxxxxxxxxxxx To unsubscribe send an email to devel-leave@xxxxxxxxxxxxxxxxx