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

@ -1,3 +1,14 @@
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)
2006-02-10 Matthias Clasen <mclasen@redhat.com>
* === Released 2.9.6 ===

View File

@ -414,13 +414,24 @@ g_thread_exit_win32_impl (void)
if (array)
{
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);