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.
This commit is contained in:
Gwenole Beauchesne 2014-12-01 16:54:32 +01:00
parent 93418ed5ee
commit 2fb20e9906
3 changed files with 60 additions and 14 deletions

View file

@ -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;
}

View file

@ -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);
}
/**

View file

@ -42,6 +42,14 @@ gst_vaapi_display_cache_new (void);
gst_vaapi_mini_object_replace ((GstVaapiMiniObject **) (old_cache_ptr), \
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);