aboutsummaryrefslogtreecommitdiff
path: root/tests/tpm-emu.c
diff options
context:
space:
mode:
authorStefan Berger <stefanb@linux.vnet.ibm.com>2018-09-07 11:47:06 -0400
committerStefan Berger <stefanb@linux.vnet.ibm.com>2018-09-07 16:37:47 -0400
commit2271b75fa9019a9ba10d38ea2cf53a2032b1d8fd (patch)
treea8fd73afcb4cafbc7223803408a571737648b930 /tests/tpm-emu.c
parent19b599f7664b2ebfd0f405fb79c14dd241557452 (diff)
tests: Fix signalling race condition in TPM tests
This patch fixes a race condition and test failure where the main process waits for the signal of a thread but the thread already sent that signal via a condition. Since these signals are non-sticky, we need to introduce a separate variable to make this signal sticky. Signed-off-by: Stefan Berger <stefanb@linux.vnet.ibm.com> Reviewed-by: Marc-André Lureau <marcandre.lureau@redhat.com>
Diffstat (limited to 'tests/tpm-emu.c')
-rw-r--r--tests/tpm-emu.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/tests/tpm-emu.c b/tests/tpm-emu.c
index 8c2bd53cad..125e697181 100644
--- a/tests/tpm-emu.c
+++ b/tests/tpm-emu.c
@@ -23,9 +23,14 @@ void tpm_emu_test_wait_cond(TestState *s)
gint64 end_time = g_get_monotonic_time() + 5 * G_TIME_SPAN_SECOND;
g_mutex_lock(&s->data_mutex);
- if (!g_cond_wait_until(&s->data_cond, &s->data_mutex, end_time)) {
+
+ if (!s->data_cond_signal &&
+ !g_cond_wait_until(&s->data_cond, &s->data_mutex, end_time)) {
g_assert_not_reached();
}
+
+ s->data_cond_signal = false;
+
g_mutex_unlock(&s->data_mutex);
}
@@ -72,6 +77,10 @@ void *tpm_emu_ctrl_thread(void *data)
QIOChannel *ioc;
qio_channel_socket_listen_sync(lioc, s->addr, &error_abort);
+
+ g_mutex_lock(&s->data_mutex);
+ s->data_cond_signal = true;
+ g_mutex_unlock(&s->data_mutex);
g_cond_signal(&s->data_cond);
qio_channel_wait(QIO_CHANNEL(lioc), G_IO_IN);