ui/cocoa: Run qemu_init in the main thread

This work is based on:
https://patchew.org/QEMU/20220317125534.38706-1-philippe.mathieu.daude@gmail.com/

Simplify the initialization dance by running qemu_init() in the main
thread before the Cocoa event loop starts. The secondary thread only
runs only qemu_main_loop() and qemu_cleanup().

This fixes a case where addRemovableDevicesMenuItems() calls
qmp_query_block() while expecting the main thread to still hold
the BQL.

Overriding the code after calling qemu_init() is done by dynamically
replacing a function pointer variable, qemu_main when initializing
ui/cocoa, which unifies the static implementation of main() for
builds with ui/cocoa and ones without ui/cocoa.

Signed-off-by: Akihiko Odaki <akihiko.odaki@gmail.com>
Message-Id: <20220819132756.74641-2-akihiko.odaki@gmail.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Akihiko Odaki 2022-08-19 22:27:54 +09:00 committed by Gerd Hoffmann
parent df6322a897
commit bab6a301c5
7 changed files with 62 additions and 105 deletions

View file

@ -30,20 +30,20 @@
#include <SDL.h>
#endif
int qemu_main(int argc, char **argv, char **envp)
int qemu_default_main(void)
{
int status;
qemu_init(argc, argv, envp);
status = qemu_main_loop();
qemu_cleanup();
return status;
}
#ifndef CONFIG_COCOA
int (*qemu_main)(void) = qemu_default_main;
int main(int argc, char **argv)
{
return qemu_main(argc, argv, NULL);
qemu_init(argc, argv);
return qemu_main();
}
#endif