diff options
author | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2014-12-01 16:54:32 +0100 |
---|---|---|
committer | Gwenole Beauchesne <gwenole.beauchesne@intel.com> | 2015-01-27 18:11:44 +0100 |
commit | 2fb20e990695537d67d6f3bbc3f13e2eed50f10f (patch) | |
tree | 57abc1d45f5af149408ba42edab7cb03b9ff870d | |
parent | 93418ed5ee1fef86ae5dc78322f8c12c936db85d (diff) |
display: use a recursive mutex for the display cache.
Use a recursive mutex for the display cache so that a 3rdparty display
object could be initialized during the initialization of the parent
display.
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplay.c | 11 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplaycache.c | 55 | ||||
-rw-r--r-- | gst-libs/gst/vaapi/gstvaapidisplaycache.h | 8 |
3 files changed, 60 insertions, 14 deletions
diff --git a/gst-libs/gst/vaapi/gstvaapidisplay.c b/gst-libs/gst/vaapi/gstvaapidisplay.c index a3b8a8dd..3f34a3ee 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplay.c +++ b/gst-libs/gst/vaapi/gstvaapidisplay.c @@ -862,10 +862,11 @@ gst_vaapi_display_destroy (GstVaapiDisplay * display) gst_vaapi_display_replace_internal (&priv->parent, NULL); - g_mutex_lock (&g_display_cache_lock); - if (priv->cache) + if (priv->cache) { + gst_vaapi_display_cache_lock (priv->cache); gst_vaapi_display_cache_remove (priv->cache, display); - g_mutex_unlock (&g_display_cache_lock); + gst_vaapi_display_cache_unlock (priv->cache); + } gst_vaapi_display_cache_replace (&priv->cache, NULL); free_display_cache (); } @@ -953,9 +954,9 @@ gst_vaapi_display_create (GstVaapiDisplay * display, gst_vaapi_display_cache_replace (&priv->cache, cache); gst_vaapi_display_cache_unref (cache); - g_mutex_lock (&g_display_cache_lock); + gst_vaapi_display_cache_lock (cache); success = gst_vaapi_display_create_unlocked (display, init_type, init_value); - g_mutex_unlock (&g_display_cache_lock); + gst_vaapi_display_cache_unlock (cache); return success; } diff --git a/gst-libs/gst/vaapi/gstvaapidisplaycache.c b/gst-libs/gst/vaapi/gstvaapidisplaycache.c index e8c08ac4..f5c6069a 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplaycache.c +++ b/gst-libs/gst/vaapi/gstvaapidisplaycache.c @@ -37,6 +37,7 @@ struct _CacheEntry struct _GstVaapiDisplayCache { GstVaapiMiniObject parent_instance; + GRecMutex mutex; GList *list; }; @@ -164,13 +165,13 @@ gst_vaapi_display_cache_finalize (GstVaapiDisplayCache * cache) { GList *l; - if (!cache->list) - return; - - for (l = cache->list; l != NULL; l = l->next) - cache_entry_free (l->data); - g_list_free (cache->list); - cache->list = NULL; + if (cache->list) { + for (l = cache->list; l != NULL; l = l->next) + cache_entry_free (l->data); + g_list_free (cache->list); + cache->list = NULL; + } + g_rec_mutex_clear (&cache->mutex); } static const GstVaapiMiniObjectClass * @@ -193,8 +194,44 @@ gst_vaapi_display_cache_class (void) GstVaapiDisplayCache * gst_vaapi_display_cache_new (void) { - return (GstVaapiDisplayCache *) - gst_vaapi_mini_object_new0 (gst_vaapi_display_cache_class ()); + GstVaapiDisplayCache *cache; + + cache = (GstVaapiDisplayCache *) + gst_vaapi_mini_object_new (gst_vaapi_display_cache_class ()); + if (!cache) + return NULL; + + g_rec_mutex_init (&cache->mutex); + cache->list = NULL; + return cache; +} + +/** + * gst_vaapi_display_cache_lock: + * @cache: the #GstVaapiDisplayCache + * + * Locks the display cache @cache. + */ +void +gst_vaapi_display_cache_lock (GstVaapiDisplayCache * cache) +{ + g_return_if_fail (cache != NULL); + + g_rec_mutex_lock (&cache->mutex); +} + +/** + * gst_vaapi_display_cache_unlock: + * @cache: the #GstVaapiDisplayCache + * + * Unlocks the display cache @cache. + */ +void +gst_vaapi_display_cache_unlock (GstVaapiDisplayCache * cache) +{ + g_return_if_fail (cache != NULL); + + g_rec_mutex_unlock (&cache->mutex); } /** diff --git a/gst-libs/gst/vaapi/gstvaapidisplaycache.h b/gst-libs/gst/vaapi/gstvaapidisplaycache.h index f7274327..9d0abb77 100644 --- a/gst-libs/gst/vaapi/gstvaapidisplaycache.h +++ b/gst-libs/gst/vaapi/gstvaapidisplaycache.h @@ -43,6 +43,14 @@ gst_vaapi_display_cache_new (void); GST_VAAPI_MINI_OBJECT (new_cache)) G_GNUC_INTERNAL +void +gst_vaapi_display_cache_lock (GstVaapiDisplayCache * cache); + +G_GNUC_INTERNAL +void +gst_vaapi_display_cache_unlock (GstVaapiDisplayCache * cache); + +G_GNUC_INTERNAL gboolean gst_vaapi_display_cache_is_empty (GstVaapiDisplayCache * cache); |