diff --git a/cpus.c b/cpus.c index c09fbef5de0ad26f710d376969e42b7d2844ee12..f547aebeaf3fe0680ca0613f5f23e96f8ab0ef01 100644 --- a/cpus.c +++ b/cpus.c @@ -1146,6 +1146,13 @@ bool qemu_in_vcpu_thread(void) return current_cpu && qemu_cpu_is_self(current_cpu); } +static __thread bool iothread_locked = false; + +bool qemu_mutex_iothread_locked(void) +{ + return iothread_locked; +} + void qemu_mutex_lock_iothread(void) { atomic_inc(&iothread_requesting_mutex); @@ -1164,10 +1171,12 @@ void qemu_mutex_lock_iothread(void) atomic_dec(&iothread_requesting_mutex); qemu_cond_broadcast(&qemu_io_proceeded_cond); } + iothread_locked = true; } void qemu_mutex_unlock_iothread(void) { + iothread_locked = false; qemu_mutex_unlock(&qemu_global_mutex); } diff --git a/include/qemu/main-loop.h b/include/qemu/main-loop.h index 0f4a0fd4b2c35bf0b63e03e5e3d2419084037d52..bc18ca30e4a8fec577b103aebd8006e27be1ec50 100644 --- a/include/qemu/main-loop.h +++ b/include/qemu/main-loop.h @@ -222,6 +222,16 @@ void qemu_set_fd_handler(int fd, int qemu_add_child_watch(pid_t pid); #endif +/** + * qemu_mutex_iothread_locked: Return lock status of the main loop mutex. + * + * The main loop mutex is the coarsest lock in QEMU, and as such it + * must always be taken outside other locks. This function helps + * functions take different paths depending on whether the current + * thread is running within the main loop mutex. + */ +bool qemu_mutex_iothread_locked(void); + /** * qemu_mutex_lock_iothread: Lock the main loop mutex. * diff --git a/stubs/iothread-lock.c b/stubs/iothread-lock.c index 5d8aca1b37d63cba061b9bee43162b4fb905e9a3..dda6f6b58dcb72342b6fc824dd943ada1ce35f48 100644 --- a/stubs/iothread-lock.c +++ b/stubs/iothread-lock.c @@ -1,6 +1,11 @@ #include "qemu-common.h" #include "qemu/main-loop.h" +bool qemu_mutex_iothread_locked(void) +{ + return true; +} + void qemu_mutex_lock_iothread(void) { }