mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-03 07:43:54 -06:00
system/main: transfer replay mutex ownership from main thread to main loop thread
On MacOS, UI event loop has to be ran in the main thread of a process.
Because of that restriction, on this platform, qemu main event loop is
ran on another thread [1].
This breaks record/replay feature, which expects thread running qemu_init
to initialize hold this lock, breaking associated functional tests on
MacOS.
Thus, as a generalization, and similar to how BQL is handled, we release
it after init, and reacquire the lock before entering main event loop,
avoiding a special case if a separate thread is used.
Tested on MacOS with:
$ meson test -C build --setup thorough --print-errorlogs \
func-x86_64-x86_64_replay func-arm-arm_replay func-aarch64-aarch64_replay
$ ./build/qemu-system-x86_64 -nographic -icount shift=auto,rr=record,rrfile=replay.log
$ ./build/qemu-system-x86_64 -nographic -icount shift=auto,rr=replay,rrfile=replay.log
[1] f5ab12caba
Fixes: https://gitlab.com/qemu-project/qemu/-/issues/2907
Signed-off-by: Pierrick Bouvier <pierrick.bouvier@linaro.org>
Reviewed-by: Nicholas Piggin <npiggin@gmail.com>
Tested-by: Philippe Mathieu-Daudé <philmd@linaro.org>
Message-ID: <20250410225550.46807-2-pierrick.bouvier@linaro.org>
Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
100e8e2b38
commit
fa3f3a33f3
1 changed files with 4 additions and 0 deletions
|
@ -25,6 +25,7 @@
|
|||
#include "qemu/osdep.h"
|
||||
#include "qemu-main.h"
|
||||
#include "qemu/main-loop.h"
|
||||
#include "system/replay.h"
|
||||
#include "system/system.h"
|
||||
|
||||
#ifdef CONFIG_SDL
|
||||
|
@ -44,10 +45,12 @@ static void *qemu_default_main(void *opaque)
|
|||
{
|
||||
int status;
|
||||
|
||||
replay_mutex_lock();
|
||||
bql_lock();
|
||||
status = qemu_main_loop();
|
||||
qemu_cleanup(status);
|
||||
bql_unlock();
|
||||
replay_mutex_unlock();
|
||||
|
||||
exit(status);
|
||||
}
|
||||
|
@ -67,6 +70,7 @@ int main(int argc, char **argv)
|
|||
{
|
||||
qemu_init(argc, argv);
|
||||
bql_unlock();
|
||||
replay_mutex_unlock();
|
||||
if (qemu_main) {
|
||||
QemuThread main_loop_thread;
|
||||
qemu_thread_create(&main_loop_thread, "qemu_main",
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue