Rework the way GStaticPrivate data is freed
authorMatthias Clasen <mclasen@redhat.com>
Sun, 2 Oct 2011 05:21:46 +0000 (01:21 -0400)
committerMatthias Clasen <mclasen@redhat.com>
Sun, 2 Oct 2011 22:32:41 +0000 (18:32 -0400)
commit1a5cc98ca2f1474c300a13247533bf0b0b05f1df
treeb736c1bd595570cdfcdba625d8b7d4db2f17dd47
parent6a31cc66cde646aee5efdd2ba8cc8a203e29f1ed
Rework the way GStaticPrivate data is freed

To avoid iterating threads in g_static_private_free(), defer freeing
the per-thread data to thread exit. The one complication here is
that it is possible for the static private index to be reused while
'old' data is still around. To deal with that case, store the 'owner'
with each per-thread data node, and free old data in
g_static_private_get() if the owner doesn't match. The remaining
possibility that a private index could be reused by a GStaticPrivate
with the same address is sufficiently unlikely that we can probably
ignore it.

With this change, per-thread data is now truly private again,
and we can drop the lock for it as well.

https://bugzilla.gnome.org/show_bug.cgi?id=660635
glib/gthread.c