diff --git a/gthread/ChangeLog b/gthread/ChangeLog index f67ed705e..56a9bf8a0 100644 --- a/gthread/ChangeLog +++ b/gthread/ChangeLog @@ -1,3 +1,14 @@ +2006-02-20 Tor Lillqvist + + * 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-01-18 Matthias Clasen * === Released 2.8.6 === diff --git a/gthread/gthread-win32.c b/gthread/gthread-win32.c index 358ba6eb3..e90bc601e 100644 --- a/gthread/gthread-win32.c +++ b/gthread/gthread-win32.c @@ -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);