qemu-devel
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [PULL 1/4] ui: Fix hanging up Cocoa display on macOS 10.15 (Catalina


From: Peter Maydell
Subject: Re: [PULL 1/4] ui: Fix hanging up Cocoa display on macOS 10.15 (Catalina)
Date: Fri, 18 Oct 2019 12:54:53 +0100

Oops, just noticed that this patch should have been
Cc: address@hidden.

Hopefully the stable team can pick it up anyway.

thanks
-- PMM

On Fri, 18 Oct 2019 at 11:17, Gerd Hoffmann <address@hidden> wrote:
>
> From: Hikaru Nishida <address@hidden>
>
> 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 <address@hidden>
> Message-id: address@hidden
> Signed-off-by: Gerd Hoffmann <address@hidden>
> ---
>  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



reply via email to

[Prev in Thread] Current Thread [Next in Thread]