From fb4e120d88777affc4a8fbeb73312b1e810e2431 Mon Sep 17 00:00:00 2001 From: Ryan Lortie Date: Sun, 16 Oct 2011 19:04:19 -0400 Subject: [PATCH] tests: merge gthread/ and glib/ atomic tests --- glib/tests/atomic.c | 60 ++++++++++++++++++++++++++++++++- gthread/tests/Makefile.am | 4 --- gthread/tests/atomic.c | 70 --------------------------------------- 3 files changed, 59 insertions(+), 75 deletions(-) delete mode 100644 gthread/tests/atomic.c diff --git a/glib/tests/atomic.c b/glib/tests/atomic.c index abacb6ca0..c1ebc666f 100644 --- a/glib/tests/atomic.c +++ b/glib/tests/atomic.c @@ -1,3 +1,14 @@ +/* + * Copyright 2011 Red Hat, Inc. + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Lesser General Public License as + * published by the Free Software Foundation; either version 2 of the + * License, or (at your option) any later version. + * + * See the included COPYING file for more information. + */ + #include static void @@ -184,8 +195,54 @@ test_types (void) gs2 = g_atomic_pointer_xor (&gs, 4); g_assert (gs2 == 12); g_assert (gs == 8); +} - return 0; +#define THREADS 10 +#define ROUNDS 10000 + +volatile gint bucket[THREADS]; +volatile gint atomic; + +static gpointer +thread_func (gpointer data) +{ + gint idx = GPOINTER_TO_INT (data); + gint i; + gint d; + + for (i = 0; i < ROUNDS; i++) + { + d = g_random_int_range (-10, 100); + bucket[idx] += d; + g_atomic_int_add (&atomic, d); + g_thread_yield (); + } + + return NULL; +} + +static void +test_threaded (void) +{ + gint sum; + gint i; + GThread *threads[THREADS]; + + atomic = 0; + for (i = 0; i < THREADS; i++) + bucket[i] = 0; + + for (i = 0; i < THREADS; i++) + threads[i] = g_thread_new ("atomic", thread_func, GINT_TO_POINTER (i)); + + for (i = 0; i < THREADS; i++) + g_thread_join (threads[i]); + + sum = 0; + for (i = 0; i < THREADS; i++) + sum += bucket[i]; + + g_assert_cmpint (sum, ==, atomic); } int @@ -194,6 +251,7 @@ main (int argc, char **argv) g_test_init (&argc, &argv, NULL); g_test_add_func ("/atomic/types", test_types); + g_test_add_func ("/atomic/threaded", test_threaded); return g_test_run (); } diff --git a/gthread/tests/Makefile.am b/gthread/tests/Makefile.am index 121ac5338..7f2229f31 100644 --- a/gthread/tests/Makefile.am +++ b/gthread/tests/Makefile.am @@ -32,10 +32,6 @@ unix_multithreaded_CFLAGS = -DTEST_THREADED unix_multithreaded_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la endif -TEST_PROGS += atomic -atomic_SOURCES = atomic.c -atomic_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la - TEST_PROGS += spawn-multithreaded spawn_multithreaded_SOURCES = spawn-multithreaded.c spawn_multithreaded_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la diff --git a/gthread/tests/atomic.c b/gthread/tests/atomic.c deleted file mode 100644 index a9a66ea28..000000000 --- a/gthread/tests/atomic.c +++ /dev/null @@ -1,70 +0,0 @@ -/* - * Copyright 2011 Red Hat, Inc. - * - * This program is free software: you can redistribute it and/or modify - * it under the terms of the GNU Lesser General Public License as - * published by the Free Software Foundation; either version 2 of the - * License, or (at your option) any later version. - * - * See the included COPYING file for more information. - */ - -#include - -#define THREADS 10 -#define ROUNDS 10000 - -volatile gint bucket[THREADS]; -volatile gint atomic; - -static gpointer -thread_func (gpointer data) -{ - gint idx = GPOINTER_TO_INT (data); - gint i; - gint d; - - for (i = 0; i < ROUNDS; i++) - { - d = g_random_int_range (-10, 100); - bucket[idx] += d; - g_atomic_int_add (&atomic, d); - g_thread_yield (); - } - - return NULL; -} - -static void -test_atomic (void) -{ - gint sum; - gint i; - GThread *threads[THREADS]; - - atomic = 0; - for (i = 0; i < THREADS; i++) - bucket[i] = 0; - - for (i = 0; i < THREADS; i++) - threads[i] = g_thread_new ("atomic", thread_func, GINT_TO_POINTER (i)); - - for (i = 0; i < THREADS; i++) - g_thread_join (threads[i]); - - sum = 0; - for (i = 0; i < THREADS; i++) - sum += bucket[i]; - - g_assert_cmpint (sum, ==, atomic); -} - -int -main (int argc, char *argv[]) -{ - g_test_init (&argc, &argv, NULL); - - g_test_add_func ("/glib/atomic/add", test_atomic); - - return g_test_run (); -}