From b4168ad3b298700302ffbba29ba0c83a2aba62b5 Mon Sep 17 00:00:00 2001 From: Tor Lillqvist Date: Mon, 20 Feb 2006 02:47:30 +0000 Subject: [PATCH] Make the implementation of GPrivate behave more closely as in POSIX 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) --- gthread/ChangeLog | 11 +++++++++++ gthread/gthread-win32.c | 25 ++++++++++++++++++------- 2 files changed, 29 insertions(+), 7 deletions(-) diff --git a/gthread/ChangeLog b/gthread/ChangeLog index 38b646dfc..b0a7d6d1b 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-02-10 Matthias Clasen * === Released 2.9.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);