mirror of https://gitlab.com/qemu-project/qemu
test-coroutine: add simple CoMutex test
In preparation for adding a similar test using QemuLockable, add a very simple testcase that has two interleaved calls to lock and unlock. Reviewed-by: Stefan Hajnoczi <stefanha@redhat.com> Signed-off-by: Paolo Bonzini <pbonzini@redhat.com> Message-Id: <20180203153935.8056-2-pbonzini@redhat.com> Reviewed-by: Richard Henderson <richard.henderson@linaro.org> Reviewed-by: Fam Zheng <famz@redhat.com> Signed-off-by: Fam Zheng <famz@redhat.com>
This commit is contained in:
parent
5b9b49d7bd
commit
439b6e5efc
|
@ -175,7 +175,7 @@ static void coroutine_fn c1_fn(void *opaque)
|
||||||
qemu_coroutine_enter(c2);
|
qemu_coroutine_enter(c2);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void test_co_queue(void)
|
static void test_no_dangling_access(void)
|
||||||
{
|
{
|
||||||
Coroutine *c1;
|
Coroutine *c1;
|
||||||
Coroutine *c2;
|
Coroutine *c2;
|
||||||
|
@ -195,6 +195,51 @@ static void test_co_queue(void)
|
||||||
*c1 = tmp;
|
*c1 = tmp;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static bool locked;
|
||||||
|
static int done;
|
||||||
|
|
||||||
|
static void coroutine_fn mutex_fn(void *opaque)
|
||||||
|
{
|
||||||
|
CoMutex *m = opaque;
|
||||||
|
qemu_co_mutex_lock(m);
|
||||||
|
assert(!locked);
|
||||||
|
locked = true;
|
||||||
|
qemu_coroutine_yield();
|
||||||
|
locked = false;
|
||||||
|
qemu_co_mutex_unlock(m);
|
||||||
|
done++;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void do_test_co_mutex(CoroutineEntry *entry, void *opaque)
|
||||||
|
{
|
||||||
|
Coroutine *c1 = qemu_coroutine_create(entry, opaque);
|
||||||
|
Coroutine *c2 = qemu_coroutine_create(entry, opaque);
|
||||||
|
|
||||||
|
done = 0;
|
||||||
|
qemu_coroutine_enter(c1);
|
||||||
|
g_assert(locked);
|
||||||
|
qemu_coroutine_enter(c2);
|
||||||
|
|
||||||
|
/* Unlock queues c2. It is then started automatically when c1 yields or
|
||||||
|
* terminates.
|
||||||
|
*/
|
||||||
|
qemu_coroutine_enter(c1);
|
||||||
|
g_assert_cmpint(done, ==, 1);
|
||||||
|
g_assert(locked);
|
||||||
|
|
||||||
|
qemu_coroutine_enter(c2);
|
||||||
|
g_assert_cmpint(done, ==, 2);
|
||||||
|
g_assert(!locked);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void test_co_mutex(void)
|
||||||
|
{
|
||||||
|
CoMutex m;
|
||||||
|
|
||||||
|
qemu_co_mutex_init(&m);
|
||||||
|
do_test_co_mutex(mutex_fn, &m);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Check that creation, enter, and return work
|
* Check that creation, enter, and return work
|
||||||
*/
|
*/
|
||||||
|
@ -422,7 +467,7 @@ int main(int argc, char **argv)
|
||||||
* crash, so skip it.
|
* crash, so skip it.
|
||||||
*/
|
*/
|
||||||
if (CONFIG_COROUTINE_POOL) {
|
if (CONFIG_COROUTINE_POOL) {
|
||||||
g_test_add_func("/basic/co_queue", test_co_queue);
|
g_test_add_func("/basic/no-dangling-access", test_no_dangling_access);
|
||||||
}
|
}
|
||||||
|
|
||||||
g_test_add_func("/basic/lifecycle", test_lifecycle);
|
g_test_add_func("/basic/lifecycle", test_lifecycle);
|
||||||
|
@ -432,6 +477,7 @@ int main(int argc, char **argv)
|
||||||
g_test_add_func("/basic/entered", test_entered);
|
g_test_add_func("/basic/entered", test_entered);
|
||||||
g_test_add_func("/basic/in_coroutine", test_in_coroutine);
|
g_test_add_func("/basic/in_coroutine", test_in_coroutine);
|
||||||
g_test_add_func("/basic/order", test_order);
|
g_test_add_func("/basic/order", test_order);
|
||||||
|
g_test_add_func("/locking/co-mutex", test_co_mutex);
|
||||||
if (g_test_perf()) {
|
if (g_test_perf()) {
|
||||||
g_test_add_func("/perf/lifecycle", perf_lifecycle);
|
g_test_add_func("/perf/lifecycle", perf_lifecycle);
|
||||||
g_test_add_func("/perf/nesting", perf_nesting);
|
g_test_add_func("/perf/nesting", perf_nesting);
|
||||||
|
|
Loading…
Reference in New Issue