Oops, just noticed that this patch should have been Cc: qemu-sta...@nongnu.org.
Hopefully the stable team can pick it up anyway. thanks -- PMM On Fri, 18 Oct 2019 at 11:17, Gerd Hoffmann <kra...@redhat.com> wrote: > > From: Hikaru Nishida <hikaru...@gmail.com> > > macOS API documentation says that before applicationDidFinishLaunching > is called, any events will not be processed. However, some events are > fired before it is called in macOS Catalina. This causes deadlock of > iothread_lock in handleEvent while it will be released after the > app_started_sem is posted. > This patch avoids processing events before the app_started_sem is > posted to prevent this deadlock. > > Buglink: https://bugs.launchpad.net/qemu/+bug/1847906 > Signed-off-by: Hikaru Nishida <hikaru...@gmail.com> > Message-id: 20191015010734.85229-1-hikaru...@gmail.com > Signed-off-by: Gerd Hoffmann <kra...@redhat.com> > --- > ui/cocoa.m | 12 ++++++++++++ > 1 file changed, 12 insertions(+) > > diff --git a/ui/cocoa.m b/ui/cocoa.m > index f12e21df6e10..fbb5b1b45f81 100644 > --- a/ui/cocoa.m > +++ b/ui/cocoa.m > @@ -134,6 +134,7 @@ NSArray * supportedImageFileTypes; > > static QemuSemaphore display_init_sem; > static QemuSemaphore app_started_sem; > +static bool allow_events; > > // Utility functions to run specified code block with iothread lock held > typedef void (^CodeBlock)(void); > @@ -729,6 +730,16 @@ QemuCocoaView *cocoaView; > > - (bool) handleEvent:(NSEvent *)event > { > + if(!allow_events) { > + /* > + * Just let OSX have all events that arrive before > + * applicationDidFinishLaunching. > + * This avoids a deadlock on the iothread lock, which > cocoa_display_init() > + * will not drop until after the app_started_sem is posted. (In > theory > + * there should not be any such events, but OSX Catalina now emits > some.) > + */ > + return false; > + } > return bool_with_iothread_lock(^{ > return [self handleEventLocked:event]; > }); > @@ -1156,6 +1167,7 @@ QemuCocoaView *cocoaView; > - (void)applicationDidFinishLaunching: (NSNotification *) note > { > COCOA_DEBUG("QemuCocoaAppController: applicationDidFinishLaunching\n"); > + allow_events = true; > /* Tell cocoa_display_init to proceed */ > qemu_sem_post(&app_started_sem); > } > -- > 2.18.1