Make the implementation of GPrivate behave more closely as in POSIX

2006-02-20  Tor Lillqvist  <tml@novell.com>

	* gthread-win32.c (g_thread_exit_win32_impl): Make the
	implementation of GPrivate behave more closely as in POSIX
	threads: The value associacted with a GPrivate must be set to NULL
	before calling the destructor. (The destructor gets the original
	value as argument.)  A destructor might re-associate a non-NULL
	value with some GPrivate. To deal with this, if after all
	destructors have been called, there still are some non-NULL
	values, the process is repeated. (#331367)
This commit is contained in:
Tor Lillqvist
2006-02-20 02:47:30 +00:00
committed by Tor Lillqvist
parent dde67f284d
commit b4168ad3b2
2 changed files with 29 additions and 7 deletions

View File

@@ -414,13 +414,24 @@ g_thread_exit_win32_impl (void)
if (array)
{
for (i = 0; i < private_max; i++)
{
GDestroyNotify destructor = g_private_destructors[i];
GDestroyNotify data = array[i];
if (destructor && data)
destructor (data);
}
gboolean some_data_non_null;
do {
some_data_non_null = FALSE;
for (i = 0; i < private_max; i++)
{
GDestroyNotify destructor = g_private_destructors[i];
GDestroyNotify data = array[i];
if (data)
some_data_non_null = TRUE;
array[i] = NULL;
if (destructor && data)
destructor (data);
}
} while (some_data_non_null);
g_free (array);