Commit c634aba6 authored by Kevin Wolf's avatar Kevin Wolf Committed by zhuyanting
Browse files

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: default avatarKevin Wolf <kwolf@redhat.com>
Tested-by: default avatarMichael Weiser <michael.weiser@gmx.de>
Reviewed-by: default avatarMichael Weiser <michael.weiser@gmx.de>
Reviewed-by: default avatarVladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: default avatarDenis V. Lunev <den@openvz.org>
Reviewed-by: default avatarMax Reitz <mreitz@redhat.com>
(cherry picked from commit 944f3d5d)
Signed-off-by: default avatarMichael Roth <mdroth@linux.vnet.ibm.com>
parent f68fb290
Loading
Loading
Loading
Loading
+15 −0
Original line number Diff line number Diff line
@@ -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