message, bus: fix async message delivery
authorTim-Philipp Müller <tim@centricular.com>
Mon, 16 Feb 2015 22:39:42 +0000 (22:39 +0000)
committerTim-Philipp Müller <tim@centricular.com>
Tue, 17 Feb 2015 09:52:09 +0000 (09:52 +0000)
commitda7847d1adde088b4d8bcfc76642cf942e735dd3
treecb9f399b3e8882e2c5e998912cc739f828f7f097
parent9f58aa080a41759462ff5771cb259ee64a7ea51e
message, bus: fix async message delivery

Async message delivery (where the posting thread gets blocked
until the message has been processed and/or freed) was pretty
much completely broken.

For one, don't use GMutex implementation details to check
whether a mutex has been initialized or not, esp. not
implementation details that don't hold true any more with
newer GLib versions where atomic ops and futexes are used
(spotted by Josep Torras). This led to async message
delivery no longer blocking with newer GLib versions on
Linux.

Secondly, after async delivery don't free mutex/GCond
embedded inside the just-freed message structure.

Use a new (private) mini object flag to signal GstMessage
that the message being freed is part of an async delivery
on the bus so that the dispose handler can keep the message
alive and the bus can free it once it's done cleaning up
stuff.
gst/gst_private.h
gst/gstbus.c
gst/gstmessage.c