From dda86638110a97518c0d76aff405ffc0781c3573 Mon Sep 17 00:00:00 2001 From: Alessandro Decina Date: Mon, 5 Jul 2010 12:56:40 +0200 Subject: [PATCH] clock: add gst_clock_id_wait_async_full. Add gst_clock_id_wait_async_full. It's the same as gst_clock_id_wait_async but allows passing a GDestroyNotify to destroy user_data. --- gst/gstclock.c | 41 ++++++++++++++++++++++++++++++++++++++--- gst/gstclock.h | 5 +++++ 2 files changed, 43 insertions(+), 3 deletions(-) diff --git a/gst/gstclock.c b/gst/gstclock.c index 925823f..ccc928b 100644 --- a/gst/gstclock.c +++ b/gst/gstclock.c @@ -202,6 +202,7 @@ gst_clock_entry_new (GstClock * clock, GstClockTime time, entry->status = GST_CLOCK_OK; entry->func = NULL; entry->user_data = NULL; + entry->destroy_data = NULL; return (GstClockID) entry; } @@ -229,9 +230,13 @@ gst_clock_id_ref (GstClockID id) static void _gst_clock_id_free (GstClockID id) { + GstClockEntry *entry; g_return_if_fail (id != NULL); GST_CAT_DEBUG (GST_CAT_CLOCK, "freed entry %p", id); + entry = (GstClockEntry *) id; + if (entry->destroy_data) + entry->destroy_data (entry->user_data); #ifndef GST_DISABLE_TRACE gst_alloc_trace_free (_gst_clock_entry_trace, id); @@ -457,10 +462,11 @@ not_supported: } /** - * gst_clock_id_wait_async: + * gst_clock_id_wait_async_full: * @id: a #GstClockID to wait on * @func: The callback function * @user_data: User data passed in the callback + * @destroy_data: #GDestroyNotify for user_data * * Register a callback on the given #GstClockID @id with the given * function and user_data. When passing a #GstClockID with an invalid @@ -474,10 +480,12 @@ not_supported: * Returns: the result of the non blocking wait. * * MT safe. + * + * Since: 0.10.30 */ GstClockReturn -gst_clock_id_wait_async (GstClockID id, - GstClockCallback func, gpointer user_data) +gst_clock_id_wait_async_full (GstClockID id, + GstClockCallback func, gpointer user_data, GDestroyNotify destroy_data) { GstClockEntry *entry; GstClock *clock; @@ -503,6 +511,7 @@ gst_clock_id_wait_async (GstClockID id, entry->func = func; entry->user_data = user_data; + entry->destroy_data = destroy_data; res = cclass->wait_async (clock, entry); @@ -524,6 +533,32 @@ not_supported: } /** + * gst_clock_id_wait_async: + * @id: a #GstClockID to wait on + * @func: The callback function + * @user_data: User data passed in the callback + * + * Register a callback on the given #GstClockID @id with the given + * function and user_data. When passing a #GstClockID with an invalid + * time to this function, the callback will be called immediately + * with a time set to GST_CLOCK_TIME_NONE. The callback will + * be called when the time of @id has been reached. + * + * The callback @func can be invoked from any thread, either provided by the + * core or from a streaming thread. The application should be prepared for this. + * + * Returns: the result of the non blocking wait. + * + * MT safe. + */ +GstClockReturn +gst_clock_id_wait_async (GstClockID id, + GstClockCallback func, gpointer user_data) +{ + return gst_clock_id_wait_async_full (id, func, user_data, NULL); +} + +/** * gst_clock_id_unschedule: * @id: The id to unschedule * diff --git a/gst/gstclock.h b/gst/gstclock.h index c0d65c5..8710dfa 100644 --- a/gst/gstclock.h +++ b/gst/gstclock.h @@ -346,6 +346,7 @@ struct _GstClockEntry { GstClockReturn status; GstClockCallback func; gpointer user_data; + GDestroyNotify destroy_data; }; /** @@ -544,6 +545,10 @@ GstClockReturn gst_clock_id_wait (GstClockID id, GstClockReturn gst_clock_id_wait_async (GstClockID id, GstClockCallback func, gpointer user_data); +GstClockReturn gst_clock_id_wait_async_full (GstClockID id, + GstClockCallback func, + gpointer user_data, + GDestroyNotify destroy_data); void gst_clock_id_unschedule (GstClockID id); -- 2.7.4