lockable: add QemuRecMutex support
The polymorphic locking macros don't support QemuRecMutex yet. Add it so that lock guards can be used with QemuRecMutex. Convert TCG plugins functions that benefit from these macros. Manual qemu_rec_mutex_lock/unlock() callers are left unmodified in cases where clarity would not improve by switching to the macros. Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com>
This commit is contained in:
parent
3284c3ddc4
commit
ac90871cf8
@ -50,6 +50,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
|
||||
#define QEMU_LOCK_FUNC(x) ((QemuLockUnlockFunc *) \
|
||||
QEMU_GENERIC(x, \
|
||||
(QemuMutex *, qemu_mutex_lock), \
|
||||
(QemuRecMutex *, qemu_rec_mutex_lock), \
|
||||
(CoMutex *, qemu_co_mutex_lock), \
|
||||
(QemuSpin *, qemu_spin_lock), \
|
||||
unknown_lock_type))
|
||||
@ -57,6 +58,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
|
||||
#define QEMU_UNLOCK_FUNC(x) ((QemuLockUnlockFunc *) \
|
||||
QEMU_GENERIC(x, \
|
||||
(QemuMutex *, qemu_mutex_unlock), \
|
||||
(QemuRecMutex *, qemu_rec_mutex_unlock), \
|
||||
(CoMutex *, qemu_co_mutex_unlock), \
|
||||
(QemuSpin *, qemu_spin_unlock), \
|
||||
unknown_lock_type))
|
||||
@ -73,7 +75,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
|
||||
|
||||
/* QEMU_MAKE_LOCKABLE - Make a polymorphic QemuLockable
|
||||
*
|
||||
* @x: a lock object (currently one of QemuMutex, CoMutex, QemuSpin).
|
||||
* @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, QemuSpin).
|
||||
*
|
||||
* Returns a QemuLockable object that can be passed around
|
||||
* to a function that can operate with locks of any kind, or
|
||||
@ -86,7 +88,7 @@ qemu_make_lockable(void *x, QemuLockable *lockable)
|
||||
|
||||
/* QEMU_MAKE_LOCKABLE_NONNULL - Make a polymorphic QemuLockable
|
||||
*
|
||||
* @x: a lock object (currently one of QemuMutex, CoMutex, QemuSpin).
|
||||
* @x: a lock object (currently one of QemuMutex, QemuRecMutex, CoMutex, QemuSpin).
|
||||
*
|
||||
* Returns a QemuLockable object that can be passed around
|
||||
* to a function that can operate with locks of any kind.
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/lockable.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/rcu_queue.h"
|
||||
#include "qemu/xxhash.h"
|
||||
@ -150,11 +151,11 @@ do_plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
|
||||
{
|
||||
struct qemu_plugin_ctx *ctx;
|
||||
|
||||
qemu_rec_mutex_lock(&plugin.lock);
|
||||
QEMU_LOCK_GUARD(&plugin.lock);
|
||||
ctx = plugin_id_to_ctx_locked(id);
|
||||
/* if the plugin is on its way out, ignore this request */
|
||||
if (unlikely(ctx->uninstalling)) {
|
||||
goto out_unlock;
|
||||
return;
|
||||
}
|
||||
if (func) {
|
||||
struct qemu_plugin_cb *cb = ctx->callbacks[ev];
|
||||
@ -178,8 +179,6 @@ do_plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
|
||||
} else {
|
||||
plugin_unregister_cb__locked(ctx, ev);
|
||||
}
|
||||
out_unlock:
|
||||
qemu_rec_mutex_unlock(&plugin.lock);
|
||||
}
|
||||
|
||||
void plugin_register_cb(qemu_plugin_id_t id, enum qemu_plugin_event ev,
|
||||
|
@ -19,6 +19,7 @@
|
||||
#include "qemu/error-report.h"
|
||||
#include "qemu/config-file.h"
|
||||
#include "qapi/error.h"
|
||||
#include "qemu/lockable.h"
|
||||
#include "qemu/option.h"
|
||||
#include "qemu/rcu_queue.h"
|
||||
#include "qemu/qht.h"
|
||||
@ -367,15 +368,14 @@ void plugin_reset_uninstall(qemu_plugin_id_t id,
|
||||
struct qemu_plugin_reset_data *data;
|
||||
struct qemu_plugin_ctx *ctx;
|
||||
|
||||
qemu_rec_mutex_lock(&plugin.lock);
|
||||
ctx = plugin_id_to_ctx_locked(id);
|
||||
if (ctx->uninstalling || (reset && ctx->resetting)) {
|
||||
qemu_rec_mutex_unlock(&plugin.lock);
|
||||
return;
|
||||
WITH_QEMU_LOCK_GUARD(&plugin.lock) {
|
||||
ctx = plugin_id_to_ctx_locked(id);
|
||||
if (ctx->uninstalling || (reset && ctx->resetting)) {
|
||||
return;
|
||||
}
|
||||
ctx->resetting = reset;
|
||||
ctx->uninstalling = !reset;
|
||||
}
|
||||
ctx->resetting = reset;
|
||||
ctx->uninstalling = !reset;
|
||||
qemu_rec_mutex_unlock(&plugin.lock);
|
||||
|
||||
data = g_new(struct qemu_plugin_reset_data, 1);
|
||||
data->ctx = ctx;
|
||||
|
Loading…
Reference in New Issue
Block a user