gst/gstsystemclock.c (gst_system_clock_init): Unlock the clock if its socks fill with rocks.

Original commit message from CVS:
2005-06-20  Andy Wingo  <wingo@pobox.com>

* gst/gstsystemclock.c (gst_system_clock_init): Unlock the clock
if its socks fill with rocks.
(gst_system_clock_obtain): Set the name on object construction.
Avoid double-checked locking.
This commit is contained in:
Andy Wingo 2005-06-20 11:41:17 +00:00
parent 5910c2f938
commit 3468457954
2 changed files with 16 additions and 14 deletions

View file

@ -1,3 +1,10 @@
2005-06-20 Andy Wingo <wingo@pobox.com>
* gst/gstsystemclock.c (gst_system_clock_init): Unlock the clock
if its socks fill with rocks.
(gst_system_clock_obtain): Set the name on object construction.
Avoid double-checked locking.
2005-06-20 Tim-Philipp Müller <tim at centricular dot net> 2005-06-20 Tim-Philipp Müller <tim at centricular dot net>
* gst/gsturi.c: (gst_element_make_from_uri): * gst/gsturi.c: (gst_element_make_from_uri):

View file

@ -122,6 +122,7 @@ gst_system_clock_init (GstSystemClock * clock)
no_thread: no_thread:
{ {
g_warning ("could not create async clock thread: %s", error->message); g_warning ("could not create async clock thread: %s", error->message);
GST_UNLOCK (clock);
} }
} }
@ -141,7 +142,7 @@ gst_system_clock_dispose (GObject * object)
} }
/** /**
* gst_system_clock_obtain * gst_system_clock_obtain:
* *
* Get a handle to the default system clock. The refcount of the * Get a handle to the default system clock. The refcount of the
* clock will be increased so you need to unref the clock after * clock will be increased so you need to unref the clock after
@ -154,24 +155,18 @@ gst_system_clock_dispose (GObject * object)
GstClock * GstClock *
gst_system_clock_obtain (void) gst_system_clock_obtain (void)
{ {
GstClock *clock = _the_system_clock; GstClock *clock;
g_static_mutex_lock (&_gst_sysclock_mutex);
clock = _the_system_clock;
if (clock == NULL) { if (clock == NULL) {
g_static_mutex_lock (&_gst_sysclock_mutex);
if (_the_system_clock != NULL) {
clock = _the_system_clock;
g_static_mutex_unlock (&_gst_sysclock_mutex);
GST_CAT_DEBUG (GST_CAT_CLOCK, "returning static system clock");
goto have_clock;
}
GST_CAT_DEBUG (GST_CAT_CLOCK, "creating new static system clock"); GST_CAT_DEBUG (GST_CAT_CLOCK, "creating new static system clock");
/* FIXME: the only way to clean this up is to have a gst_exit() /* FIXME: the only way to clean this up is to have a gst_exit()
* function; until then, the program will always end with the sysclock * function; until then, the program will always end with the sysclock
* at refcount 1 */ * at refcount 1 */
clock = GST_CLOCK (g_object_new (GST_TYPE_SYSTEM_CLOCK, NULL)); clock = g_object_new (GST_TYPE_SYSTEM_CLOCK,
"name", "GstSystemClock", NULL);
gst_object_set_name (GST_OBJECT (clock), "GstSystemClock");
/* we created the global clock; take ownership so /* we created the global clock; take ownership so
* we can hand out instances later */ * we can hand out instances later */
@ -181,10 +176,10 @@ gst_system_clock_obtain (void)
_the_system_clock = clock; _the_system_clock = clock;
g_static_mutex_unlock (&_gst_sysclock_mutex); g_static_mutex_unlock (&_gst_sysclock_mutex);
} else { } else {
g_static_mutex_unlock (&_gst_sysclock_mutex);
GST_CAT_DEBUG (GST_CAT_CLOCK, "returning static system clock"); GST_CAT_DEBUG (GST_CAT_CLOCK, "returning static system clock");
} }
have_clock:
/* we ref it since we are a clock factory. */ /* we ref it since we are a clock factory. */
gst_object_ref (GST_OBJECT (clock)); gst_object_ref (GST_OBJECT (clock));
return clock; return clock;