glib/tests/cond: Fix race condition

The producer could push two values with the first one being
lost.  Fix this by blocking the producer until a consumer
reads.
This commit is contained in:
Colin Walters 2013-05-23 01:07:13 +01:00
parent 9115dd0a7c
commit ff8f37ac05

View File

@ -33,6 +33,8 @@ static void
push_value (gint value) push_value (gint value)
{ {
g_mutex_lock (&mutex); g_mutex_lock (&mutex);
while (next != 0)
g_cond_wait (&cond, &mutex);
next = value; next = value;
if (g_test_verbose ()) if (g_test_verbose ())
g_print ("Thread %p producing next value: %d\n", g_thread_self (), value); g_print ("Thread %p producing next value: %d\n", g_thread_self (), value);
@ -57,6 +59,7 @@ pop_value (void)
} }
value = next; value = next;
next = 0; next = 0;
g_cond_broadcast (&cond);
if (g_test_verbose ()) if (g_test_verbose ())
g_print ("Thread %p consuming value %d\n", g_thread_self (), value); g_print ("Thread %p consuming value %d\n", g_thread_self (), value);
g_mutex_unlock (&mutex); g_mutex_unlock (&mutex);
@ -76,11 +79,9 @@ produce_values (gpointer data)
{ {
total += i; total += i;
push_value (i); push_value (i);
g_usleep (1000);
} }
push_value (-1); push_value (-1);
g_usleep (1000);
push_value (-1); push_value (-1);
if (g_test_verbose ()) if (g_test_verbose ())