From: Kevin Wolf Date: Thu, 24 Oct 2019 14:26:57 +0000 (+0200) Subject: coroutine: Add qemu_co_mutex_assert_locked() X-Git-Tag: v4.2.0-rc0~37^2~1 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=944f3d5dd21;p=thirdparty%2Fqemu.git coroutine: Add qemu_co_mutex_assert_locked() Some functions require that the caller holds a certain CoMutex for them to operate correctly. Add a function so that they can assert the lock is really held. Cc: qemu-stable@nongnu.org Signed-off-by: Kevin Wolf Tested-by: Michael Weiser Reviewed-by: Michael Weiser Reviewed-by: Vladimir Sementsov-Ogievskiy Reviewed-by: Denis V. Lunev Reviewed-by: Max Reitz --- diff --git a/include/qemu/coroutine.h b/include/qemu/coroutine.h index 8d55663062a..dfd261c5b1f 100644 --- a/include/qemu/coroutine.h +++ b/include/qemu/coroutine.h @@ -167,6 +167,21 @@ void coroutine_fn qemu_co_mutex_lock(CoMutex *mutex); */ void coroutine_fn qemu_co_mutex_unlock(CoMutex *mutex); +/** + * Assert that the current coroutine holds @mutex. + */ +static inline coroutine_fn void qemu_co_mutex_assert_locked(CoMutex *mutex) +{ + /* + * mutex->holder doesn't need any synchronisation if the assertion holds + * true because the mutex protects it. If it doesn't hold true, we still + * don't mind if another thread takes or releases mutex behind our back, + * because the condition will be false no matter whether we read NULL or + * the pointer for any other coroutine. + */ + assert(atomic_read(&mutex->locked) && + mutex->holder == qemu_coroutine_self()); +} /** * CoQueues are a mechanism to queue coroutines in order to continue executing