8d65dee2c4
The updateUIInfo method makes Cocoa API calls. It also calls back into QEMU functions like dpy_set_ui_info(). To do this safely, we need to follow two rules: * Cocoa API calls are made on the Cocoa UI thread * When calling back into QEMU we must hold the iothread lock Fix the places where we got this wrong, by taking the iothread lock while executing updateUIInfo, and moving the call in cocoa_switch() inside the dispatch_async block. Some of the Cocoa UI methods which call updateUIInfo are invoked as part of the initial application startup, while we're still doing the little cross-thread dance described in the comment just above call_qemu_main(). This meant they were calling back into the QEMU UI layer before we'd actually finished initializing our display and registered the DisplayChangeListener, which isn't really valid. Once updateUIInfo takes the iothread lock, we no longer get away with this, because during this startup phase the iothread lock is held by the QEMU main-loop thread which is waiting for us to finish our display initialization. So we must suppress updateUIInfo until applicationDidFinishLaunching allows the QEMU main-loop thread to continue. Signed-off-by: Peter Maydell <peter.maydell@linaro.org> Reviewed-by: Akihiko Odaki <akihiko.odaki@gmail.com> Tested-by: Akihiko Odaki <akihiko.odaki@gmail.com> Message-id: 20220224101330.967429-2-peter.maydell@linaro.org |
||
---|---|---|
.. | ||
icons | ||
keycodemapdb@d21009b1c9 | ||
shader | ||
clipboard.c | ||
cocoa.m | ||
console-gl.c | ||
console.c | ||
curses_keys.h | ||
curses.c | ||
cursor_hidden.xpm | ||
cursor_left_ptr.xpm | ||
cursor.c | ||
dbus-chardev.c | ||
dbus-clipboard.c | ||
dbus-console.c | ||
dbus-display1.xml | ||
dbus-error.c | ||
dbus-listener.c | ||
dbus-module.c | ||
dbus.c | ||
dbus.h | ||
egl-context.c | ||
egl-headless.c | ||
egl-helpers.c | ||
gtk-clipboard.c | ||
gtk-egl.c | ||
gtk-gl-area.c | ||
gtk.c | ||
input-barrier.c | ||
input-barrier.h | ||
input-keymap.c | ||
input-legacy.c | ||
input-linux.c | ||
input.c | ||
kbd-state.c | ||
keymaps.c | ||
keymaps.h | ||
meson.build | ||
qemu-pixman.c | ||
qemu-x509.h | ||
qemu.desktop | ||
sdl2-2d.c | ||
sdl2-gl.c | ||
sdl2-input.c | ||
sdl2.c | ||
shader.c | ||
spice-app.c | ||
spice-core.c | ||
spice-display.c | ||
spice-input.c | ||
spice-module.c | ||
trace-events | ||
trace.h | ||
udmabuf.c | ||
util.c | ||
vdagent.c | ||
vgafont.h | ||
vnc_keysym.h | ||
vnc-auth-sasl.c | ||
vnc-auth-sasl.h | ||
vnc-auth-vencrypt.c | ||
vnc-auth-vencrypt.h | ||
vnc-clipboard.c | ||
vnc-enc-hextile-template.h | ||
vnc-enc-hextile.c | ||
vnc-enc-tight.c | ||
vnc-enc-tight.h | ||
vnc-enc-zlib.c | ||
vnc-enc-zrle.c | ||
vnc-enc-zrle.c.inc | ||
vnc-enc-zrle.h | ||
vnc-enc-zywrle-template.c | ||
vnc-enc-zywrle.h | ||
vnc-jobs.c | ||
vnc-jobs.h | ||
vnc-palette.c | ||
vnc-palette.h | ||
vnc-stubs.c | ||
vnc-ws.c | ||
vnc-ws.h | ||
vnc.c | ||
vnc.h | ||
win32-kbd-hook.c | ||
x_keymap.c | ||
x_keymap.h |