mirror of
https://gitlab.gnome.org/GNOME/glib.git
synced 2025-02-24 19:22:11 +01:00
Add a regression test for GNOME#642026
Bug: https://bugzilla.gnome.org/show_bug.cgi?id=642026 Bug-NB: NB#257512
This commit is contained in:
parent
2b358b082a
commit
9a36b75823
91
gthread/tests/642026.c
Normal file
91
gthread/tests/642026.c
Normal file
@ -0,0 +1,91 @@
|
||||
/*
|
||||
* Author: Simon McVittie <simon.mcvittie@collabora.co.uk>
|
||||
* Copyright © 2011 Nokia Corporation
|
||||
*
|
||||
* 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 <glib.h>
|
||||
|
||||
/* On smcv's laptop, 1e4 iterations didn't always exhibit the bug, but 1e5
|
||||
* iterations exhibited it 10/10 times in practice. YMMV. */
|
||||
#define ITERATIONS 100000
|
||||
|
||||
static GStaticPrivate sp;
|
||||
static GMutex *mutex;
|
||||
static GCond *cond;
|
||||
static guint i;
|
||||
|
||||
static volatile gint freed = 0;
|
||||
|
||||
static void
|
||||
notify (gpointer p)
|
||||
{
|
||||
if (!g_atomic_int_compare_and_exchange (&freed, 0, 1))
|
||||
{
|
||||
g_error ("someone already freed it after %u iterations", i);
|
||||
}
|
||||
}
|
||||
|
||||
static gpointer thread_func (gpointer nil)
|
||||
{
|
||||
/* wait for main thread to reach its g_cond_wait call */
|
||||
g_mutex_lock (mutex);
|
||||
|
||||
g_static_private_set (&sp, &sp, notify);
|
||||
g_cond_broadcast (cond);
|
||||
g_mutex_unlock (mutex);
|
||||
|
||||
return nil;
|
||||
}
|
||||
|
||||
void
|
||||
testcase (void)
|
||||
{
|
||||
g_test_bug ("642026");
|
||||
|
||||
g_thread_init (NULL);
|
||||
|
||||
mutex = g_mutex_new ();
|
||||
cond = g_cond_new ();
|
||||
|
||||
g_mutex_lock (mutex);
|
||||
|
||||
for (i = 0; i < ITERATIONS; i++)
|
||||
{
|
||||
GThread *t1;
|
||||
|
||||
g_static_private_init (&sp);
|
||||
freed = 0;
|
||||
|
||||
t1 = g_thread_create (thread_func, NULL, TRUE, NULL);
|
||||
|
||||
/* wait for t1 to set up its thread-private data */
|
||||
g_cond_wait (cond, mutex);
|
||||
|
||||
/* exercise the bug, by racing with t1 to free the private data */
|
||||
g_static_private_free (&sp);
|
||||
g_thread_join (t1);
|
||||
}
|
||||
|
||||
g_cond_free (cond);
|
||||
g_mutex_unlock (mutex);
|
||||
g_mutex_free (mutex);
|
||||
}
|
||||
|
||||
int
|
||||
main (int argc,
|
||||
char **argv)
|
||||
{
|
||||
g_test_init (&argc, &argv, NULL);
|
||||
g_test_bug_base ("https://bugzilla.gnome.org/show_bug.cgi?id=");
|
||||
|
||||
g_test_add_func ("/glib/642026", testcase);
|
||||
|
||||
return g_test_run ();
|
||||
}
|
@ -9,6 +9,9 @@ progs_ldadd = $(top_builddir)/glib/libglib-2.0.la \
|
||||
TEST_PROGS += 1bit-mutex
|
||||
1bit_mutex_LDADD = $(progs_ldadd) $(top_builddir)/gthread/libgthread-2.0.la
|
||||
|
||||
TEST_PROGS += 642026
|
||||
642026_LDADD = $(progs_ldadd)
|
||||
|
||||
TEST_PROGS += 1bit-emufutex
|
||||
1bit_emufutex_SOURCES = 1bit-mutex.c
|
||||
1bit_emufutex_CFLAGS = -DTEST_EMULATED_FUTEX
|
||||
|
Loading…
x
Reference in New Issue
Block a user