From 406f7d2b39dab16cd38ccdbd4c978490eb1a2ba1 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Fri, 30 Sep 2011 23:05:27 -0400 Subject: [PATCH] mutex testcase: add a performance test Add a reasonable performance test for uncontended and contended cases. --- glib/tests/mutex.c | 68 ++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 68 insertions(+) diff --git a/glib/tests/mutex.c b/glib/tests/mutex.c index 6d1828a..66ec5fb 100644 --- a/glib/tests/mutex.c +++ b/glib/tests/mutex.c @@ -22,6 +22,8 @@ #include +#include + static void test_mutex1 (void) { @@ -152,6 +154,58 @@ test_mutex5 (void) g_assert (owners[i] == NULL); } +#define COUNT_TO 100000000 + +static gboolean +do_addition (gint *value) +{ + static GMutex lock = G_MUTEX_INIT; + gboolean more; + + /* test performance of "good" cases (ie: short critical sections) */ + g_mutex_lock (&lock); + if ((more = *value != COUNT_TO)) + if (*value != -1) + (*value)++; + g_mutex_unlock (&lock); + + return more; +} + +static gpointer +addition_thread (gpointer value) +{ + while (do_addition (value)); + + return NULL; +} + +static void +test_mutex_perf (gconstpointer data) +{ + gint n_threads = GPOINTER_TO_INT (data); + GThread *threads[THREADS]; + gint64 start_time; + gdouble rate; + gint x = -1; + gint i; + + for (i = 0; i < n_threads - 1; i++) + threads[i] = g_thread_create (addition_thread, &x, TRUE, NULL); + + /* avoid measuring thread setup/teardown time */ + start_time = g_get_monotonic_time (); + g_atomic_int_set (&x, 0); + addition_thread (&x); + g_assert_cmpint (g_atomic_int_get (&x), ==, COUNT_TO); + rate = g_get_monotonic_time () - start_time; + rate = x / rate; + + for (i = 0; i < n_threads - 1; i++) + g_thread_join (threads[i]); + + g_test_maximized_result (rate, "%f mips", rate); +} int main (int argc, char *argv[]) @@ -164,5 +218,19 @@ main (int argc, char *argv[]) g_test_add_func ("/thread/mutex4", test_mutex4); g_test_add_func ("/thread/mutex5", test_mutex5); + if (g_test_perf ()) + { + gint i; + + g_test_add_data_func ("/thread/mutex/perf/uncontended", NULL, test_mutex_perf); + + for (i = 1; i <= 10; i++) + { + gchar name[80]; + sprintf (name, "/thread/mutex/perf/contended/%d", i); + g_test_add_data_func (name, GINT_TO_POINTER (i), test_mutex_perf); + } + } + return g_test_run (); } -- 2.7.4