From 436d77f70ac9aed56d1b5f223e05a29e34378444 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Tue, 18 Feb 2014 19:04:24 -0500 Subject: [PATCH] tests: add a test for g_cond_wait_until() https://bugzilla.gnome.org/show_bug.cgi?id=673607 --- glib/tests/cond.c | 38 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/glib/tests/cond.c b/glib/tests/cond.c index f2ea6b0..480e32e 100644 --- a/glib/tests/cond.c +++ b/glib/tests/cond.c @@ -25,6 +25,8 @@ #include +#include + static GCond cond; static GMutex mutex; static volatile gint next; @@ -232,6 +234,41 @@ test_cond2 (void) barrier_clear (&b); } +static void +test_wait_until (void) +{ + gint64 until; + GMutex lock; + GCond cond; + + /* This test will make sure we don't wait too much or too little. + * + * We check the 'too long' with a timeout of 60 seconds. + * + * We check the 'too short' by verifying a guarantee of the API: we + * should not wake up until the specified time has passed. + */ + g_mutex_init (&lock); + g_cond_init (&cond); + + /* Don't wait forever... */ + alarm (60); + + until = g_get_monotonic_time () + G_TIME_SPAN_SECOND; + + /* Could still have spurious wakeups, so we must loop... */ + g_mutex_lock (&lock); + while (g_cond_wait_until (&cond, &lock, until)) + ; + g_mutex_unlock (&lock); + + /* Make sure it's after the until time */ + g_assert_cmpint (until, <=, g_get_monotonic_time ()); + + g_mutex_clear (&lock); + g_cond_clear (&cond); +} + int main (int argc, char *argv[]) { @@ -239,6 +276,7 @@ main (int argc, char *argv[]) g_test_add_func ("/thread/cond1", test_cond1); g_test_add_func ("/thread/cond2", test_cond2); + g_test_add_func ("/thread/cond/wait-until", test_wait_until); return g_test_run (); } -- 2.7.4