[vlc-devel] [PATCH 2/8] picture_pool: use a separate API to cancel pending picture requests

Rémi Denis-Courmont remi at remlab.net
Mon Jul 27 17:56:14 CEST 2020


Hi,

I don't really see the point in splitting this to a separate structure seen as it's impossible to disentangle the internals.

Le 27 juillet 2020 16:45:23 GMT+03:00, Steve Lhomme <robux4 at ycbcr.xyz> a écrit :
>---
> include/vlc_picture_pool.h | 27 ++++++++++++++++
> src/misc/picture_pool.c    | 66 ++++++++++++++++++++++++--------------
> 2 files changed, 69 insertions(+), 24 deletions(-)
>
>diff --git a/include/vlc_picture_pool.h b/include/vlc_picture_pool.h
>index 4f4010f745a..70617aa660a 100644
>--- a/include/vlc_picture_pool.h
>+++ b/include/vlc_picture_pool.h
>@@ -30,6 +30,8 @@
> 
> #include <vlc_picture.h>
> 
>+typedef struct vlc_cancelable vlc_cancelable;
>+
> /**
>  * Picture pool handle
>  */
>@@ -137,5 +139,30 @@ VLC_USED;
> unsigned picture_pool_GetSize(const picture_pool_t *);
> 
> 
>+struct vlc_cancelable {
>+    vlc_mutex_t lock;
>+    vlc_cond_t  wait;
>+    bool        canceled;
>+};
>+
>+/**
>+ * Initialize a vlc_cancelable
>+ */
>+void vlc_cancelable_Init(vlc_cancelable *);
>+
>+/**
>+ * Wait for until the vlc_cancelable is canceled or it's signaled.
>+ */
>+bool vlc_cancelable_Wait(vlc_cancelable*);
>+
>+/**
>+ * Set the canceled state of the vlc_cancelable.
>+ *
>+ * This function will also unblock vlc_cancelable_Wait() if the
>vlc_cancelable
>+ * is set to canceled.
>+ */
>+void vlc_cancelable_SetCanceled(vlc_cancelable*, bool);
>+
>+
> #endif /* VLC_PICTURE_POOL_H */
> 
>diff --git a/src/misc/picture_pool.c b/src/misc/picture_pool.c
>index a942a697995..2605b37454f 100644
>--- a/src/misc/picture_pool.c
>+++ b/src/misc/picture_pool.c
>@@ -39,10 +39,8 @@
>static_assert ((POOL_MAX & (POOL_MAX - 1)) == 0, "Not a power of two");
> 
> struct picture_pool_t {
>-    vlc_mutex_t lock;
>-    vlc_cond_t  wait;
>+    vlc_cancelable cancel;
> 
>-    bool               canceled;
>     unsigned long long available;
>     atomic_ushort      refs;
>     unsigned short     picture_count;
>@@ -75,11 +73,11 @@ static void picture_pool_ReleaseClone(picture_t
>*clone)
> 
>     picture_Release(picture);
> 
>-    vlc_mutex_lock(&pool->lock);
>+    vlc_mutex_lock(&pool->cancel.lock);
>     assert(!(pool->available & (1ULL << offset)));
>     pool->available |= 1ULL << offset;
>-    vlc_cond_signal(&pool->wait);
>-    vlc_mutex_unlock(&pool->lock);
>+    vlc_cond_signal(&pool->cancel.wait);
>+    vlc_mutex_unlock(&pool->cancel.lock);
> 
>     picture_pool_Destroy(pool);
> }
>@@ -107,8 +105,8 @@ picture_pool_t *picture_pool_New(unsigned count,
>picture_t *const *tab)
>     if (unlikely(pool == NULL))
>         return NULL;
> 
>-    vlc_mutex_init(&pool->lock);
>-    vlc_cond_init(&pool->wait);
>+    vlc_cancelable_Init( &pool->cancel );
>+
>     if (count == POOL_MAX)
>         pool->available = ~0ULL;
>     else
>@@ -116,7 +114,6 @@ picture_pool_t *picture_pool_New(unsigned count,
>picture_t *const *tab)
>     atomic_init(&pool->refs,  1);
>     pool->picture_count = count;
>     memcpy(pool->picture, tab, count * sizeof (picture_t *));
>-    pool->canceled = false;
>     return pool;
> }
> 
>@@ -171,7 +168,7 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
> {
>     unsigned long long available;
> 
>-    vlc_mutex_lock(&pool->lock);
>+    vlc_mutex_lock(&pool->cancel.lock);
>     assert(pool->refs > 0);
>     available = pool->available;
> 
>@@ -179,11 +176,11 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
>     {
>         int i = ctz(available);
> 
>-        if (unlikely(pool->canceled))
>+        if (unlikely(pool->cancel.canceled))
>             break;
> 
>         pool->available &= ~(1ULL << i);
>-        vlc_mutex_unlock(&pool->lock);
>+        vlc_mutex_unlock(&pool->cancel.lock);
>         available &= ~(1ULL << i);
> 
>         picture_t *clone = picture_pool_ClonePicture(pool, i);
>@@ -194,28 +191,27 @@ picture_t *picture_pool_Get(picture_pool_t *pool)
>         return clone;
>     }
> 
>-    vlc_mutex_unlock(&pool->lock);
>+    vlc_mutex_unlock(&pool->cancel.lock);
>     return NULL;
> }
> 
> picture_t *picture_pool_Wait(picture_pool_t *pool)
> {
>-    vlc_mutex_lock(&pool->lock);
>+    vlc_mutex_lock(&pool->cancel.lock);
>     assert(pool->refs > 0);
> 
>     while (pool->available == 0)
>     {
>-        if (pool->canceled)
>+        if (!vlc_cancelable_Wait(&pool->cancel))
>         {
>-            vlc_mutex_unlock(&pool->lock);
>+            vlc_mutex_unlock(&pool->cancel.lock);
>             return NULL;
>         }
>-        vlc_cond_wait(&pool->wait, &pool->lock);
>     }
> 
>     int i = ctz(pool->available);
>     pool->available &= ~(1ULL << i);
>-    vlc_mutex_unlock(&pool->lock);
>+    vlc_mutex_unlock(&pool->cancel.lock);
> 
>     picture_t *clone = picture_pool_ClonePicture(pool, i);
>     if (clone != NULL) {
>@@ -227,16 +223,38 @@ picture_t *picture_pool_Wait(picture_pool_t
>*pool)
> 
> void picture_pool_Cancel(picture_pool_t *pool, bool canceled)
> {
>-    vlc_mutex_lock(&pool->lock);
>     assert(pool->refs > 0);
>-
>-    pool->canceled = canceled;
>-    if (canceled)
>-        vlc_cond_broadcast(&pool->wait);
>-    vlc_mutex_unlock(&pool->lock);
>+    vlc_cancelable_SetCanceled( &pool->cancel, canceled );
> }
> 
> unsigned picture_pool_GetSize(const picture_pool_t *pool)
> {
>     return pool->picture_count;
> }
>+
>+
>+void vlc_cancelable_Init(vlc_cancelable *cancel)
>+{
>+    vlc_mutex_init(&cancel->lock);
>+    vlc_cond_init(&cancel->wait);
>+    cancel->canceled = false;
>+}
>+
>+bool vlc_cancelable_Wait(vlc_cancelable *cancel)
>+{
>+    vlc_mutex_assert(&cancel->lock);
>+    if (cancel->canceled)
>+        return false;
>+
>+    vlc_cond_wait(&cancel->wait, &cancel->lock);
>+    return true;
>+}
>+
>+void vlc_cancelable_SetCanceled(vlc_cancelable *cancel, bool canceled)
>+{
>+    vlc_mutex_lock(&cancel->lock);
>+    cancel->canceled = canceled;
>+    if (canceled)
>+        vlc_cond_broadcast(&cancel->wait);
>+    vlc_mutex_unlock(&cancel->lock);
>+}
>-- 
>2.26.2
>
>_______________________________________________
>vlc-devel mailing list
>To unsubscribe or modify your subscription options:
>https://mailman.videolan.org/listinfo/vlc-devel

-- 
Envoyé de mon appareil Android avec Courriel K-9 Mail. Veuillez excuser ma brièveté.
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mailman.videolan.org/pipermail/vlc-devel/attachments/20200727/d9b81ada/attachment.html>


More information about the vlc-devel mailing list