Re: bug in thread-test.c
- From: Sebastian Wilhelmi <wilhelmi ira uka de>
- To: Miroslaw Dobrzanski-Neumann <mne mosaic-ag com>
- Cc: GTKDEV <gtk-devel-list gnome org>
- Subject: Re: bug in thread-test.c
- Date: 12 Feb 2002 16:42:48 +0100
Hi,
> the next bug
>
> line 61 fails
> if the test_g_static_rec_mutex_thread starts immediately and is not interrupted, than test_g_static_rec_mutex_int is still 0 as set in line 49.
>
> you should test_g_static_rec_mutex_mutex = 42 before call to g_thread_create()
Can you try the attached patch. (Now it really is attached ;-)
Bye,
Sebastian
--
Sebastian Wilhelmi
mailto:wilhelmi ira uka de
http://goethe.ira.uka.de/~wilhelmi
Index: thread-test.c
===================================================================
RCS file: /cvs/gnome/glib/tests/thread-test.c,v
retrieving revision 1.8
diff -p -u -b -B -r1.8 thread-test.c
--- thread-test.c 2001/05/18 08:44:57 1.8
+++ thread-test.c 2002/02/12 15:41:57
@@ -4,6 +4,7 @@
static GMutex* test_g_mutex_mutex = NULL;
static guint test_g_mutex_int = 0;
+static gboolean test_g_mutex_thread_ready;
G_LOCK_DEFINE_STATIC (test_g_mutex);
static gpointer
@@ -12,6 +13,7 @@ test_g_mutex_thread (gpointer data)
g_assert (GPOINTER_TO_INT (data) == 42);
g_assert (g_mutex_trylock (test_g_mutex_mutex) == FALSE);
g_assert (G_TRYLOCK (test_g_mutex) == FALSE);
+ test_g_mutex_thread_ready = TRUE;
g_mutex_lock (test_g_mutex_mutex);
g_assert (test_g_mutex_int == 42);
g_mutex_unlock (test_g_mutex_mutex);
@@ -27,9 +29,13 @@ test_g_mutex (void)
g_assert (g_mutex_trylock (test_g_mutex_mutex));
g_assert (G_TRYLOCK (test_g_mutex));
+ test_g_mutex_thread_ready = FALSE;
thread = g_thread_create (test_g_mutex_thread, GINT_TO_POINTER (42),
TRUE, NULL);
- g_usleep (G_USEC_PER_SEC);
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (!test_g_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
test_g_mutex_int = 42;
G_UNLOCK (test_g_mutex);
g_mutex_unlock (test_g_mutex_mutex);
@@ -41,6 +47,7 @@ test_g_mutex (void)
static GStaticRecMutex test_g_static_rec_mutex_mutex = G_STATIC_REC_MUTEX_INIT;
static guint test_g_static_rec_mutex_int = 0;
+static gboolean test_g_static_rec_mutex_thread_ready;
static gpointer
test_g_static_rec_mutex_thread (gpointer data)
@@ -48,9 +55,11 @@ test_g_static_rec_mutex_thread (gpointer
g_assert (GPOINTER_TO_INT (data) == 42);
g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex)
== FALSE);
+ test_g_static_rec_mutex_thread_ready = TRUE;
g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
g_assert (test_g_static_rec_mutex_int == 42);
+ test_g_static_rec_mutex_thread_ready = FALSE;
g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
@@ -66,16 +75,25 @@ test_g_static_rec_mutex (void)
GThread *thread;
g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
+ test_g_static_rec_mutex_thread_ready = FALSE;
thread = g_thread_create (test_g_static_rec_mutex_thread,
GINT_TO_POINTER (42), TRUE, NULL);
- g_usleep (G_USEC_PER_SEC);
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (!test_g_static_rec_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
+
g_assert (g_static_rec_mutex_trylock (&test_g_static_rec_mutex_mutex));
- g_usleep (G_USEC_PER_SEC);
test_g_static_rec_mutex_int = 41;
g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
test_g_static_rec_mutex_int = 42;
g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
- g_usleep (G_USEC_PER_SEC);
+
+ /* This busy wait is only for testing purposes and not an example of
+ * good code!*/
+ while (test_g_static_rec_mutex_thread_ready)
+ g_usleep (G_USEC_PER_SEC / 5);
+
g_static_rec_mutex_lock (&test_g_static_rec_mutex_mutex);
test_g_static_rec_mutex_int = 0;
g_static_rec_mutex_unlock (&test_g_static_rec_mutex_mutex);
@@ -224,7 +242,7 @@ test_g_static_rw_lock_thread (gpointer d
test_g_static_rw_lock_state++;
G_UNLOCK (test_g_static_rw_lock_state);
- g_usleep (10);
+ g_usleep (g_random_int_range (20,1000));
G_LOCK (test_g_static_rw_lock_state);
test_g_static_rw_lock_state--;
@@ -245,7 +263,7 @@ test_g_static_rw_lock_thread (gpointer d
test_g_static_rw_lock_state = -1;
G_UNLOCK (test_g_static_rw_lock_state);
- g_usleep (10);
+ g_usleep (g_random_int_range (20,1000));
G_LOCK (test_g_static_rw_lock_state);
test_g_static_rw_lock_state = 0;
@@ -267,7 +285,7 @@ test_g_static_rw_lock ()
threads[i] = g_thread_create (test_g_static_rw_lock_thread,
NULL, TRUE, NULL);
}
- g_usleep (G_USEC_PER_SEC);
+ g_usleep (G_USEC_PER_SEC * 5);
test_g_static_rw_lock_run = FALSE;
for (i = 0; i < THREADS; i++)
{
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]