diff mbox

[FFmpeg-devel] lavu/threadmessage: add av_thread_message_queue_nelem()

Message ID 20180421195137.13583-1-u@pkh.me
State Superseded
Headers show

Commit Message

Clément Bœsch April 21, 2018, 7:51 p.m. UTC
---
Been away from FFmpeg for way too long. Hope this patch get me back on
track. Feel free to nitpick on the name.
---
 doc/APIchanges                     | 3 +++
 libavutil/threadmessage.c          | 9 +++++++++
 libavutil/threadmessage.h          | 5 +++++
 libavutil/version.h                | 2 +-
 tests/api/api-threadmessage-test.c | 4 +++-
 5 files changed, 21 insertions(+), 2 deletions(-)

Comments

Michael Niedermayer April 21, 2018, 11:09 p.m. UTC | #1
On Sat, Apr 21, 2018 at 09:51:37PM +0200, Clément Bœsch wrote:
> ---
> Been away from FFmpeg for way too long. Hope this patch get me back on
> track. Feel free to nitpick on the name.
> ---
>  doc/APIchanges                     | 3 +++
>  libavutil/threadmessage.c          | 9 +++++++++
>  libavutil/threadmessage.h          | 5 +++++
>  libavutil/version.h                | 2 +-
>  tests/api/api-threadmessage-test.c | 4 +++-
>  5 files changed, 21 insertions(+), 2 deletions(-)

breaks build with:
make distclean ; ./configure --disable-pthreads && make -j12

libavutil/threadmessage.c: In function ‘av_thread_message_queue_nelem’:
libavutil/threadmessage.c:108:5: error: implicit declaration of function ‘pthread_mutex_lock’ [-Werror=implicit-function-declaration]
     pthread_mutex_lock(&mq->lock);
     ^
libavutil/threadmessage.c:108:27: error: ‘AVThreadMessageQueue’ has no member named ‘lock’
     pthread_mutex_lock(&mq->lock);
                           ^
libavutil/threadmessage.c:109:26: error: ‘AVThreadMessageQueue’ has no member named ‘fifo’
     ret = av_fifo_size(mq->fifo);
                          ^
libavutil/threadmessage.c:110:5: error: implicit declaration of function ‘pthread_mutex_unlock’ [-Werror=implicit-function-declaration]
     pthread_mutex_unlock(&mq->lock);
     ^
libavutil/threadmessage.c:110:29: error: ‘AVThreadMessageQueue’ has no member named ‘lock’
     pthread_mutex_unlock(&mq->lock);
                             ^
libavutil/threadmessage.c:111:20: error: ‘AVThreadMessageQueue’ has no member named ‘elsize’
     return ret / mq->elsize;
                    ^
libavutil/threadmessage.c:112:1: error: control reaches end of non-void function [-Werror=return-type]
 }
 ^

[...]
Rostislav Pehlivanov April 22, 2018, 1:51 a.m. UTC | #2
On 21 April 2018 at 20:51, Clément Bœsch <u@pkh.me> wrote:

> ---
> Been away from FFmpeg for way too long. Hope this patch get me back on
> track. Feel free to nitpick on the name.
> ---
>  doc/APIchanges                     | 3 +++
>  libavutil/threadmessage.c          | 9 +++++++++
>  libavutil/threadmessage.h          | 5 +++++
>  libavutil/version.h                | 2 +-
>  tests/api/api-threadmessage-test.c | 4 +++-
>  5 files changed, 21 insertions(+), 2 deletions(-)
>
> diff --git a/doc/APIchanges b/doc/APIchanges
> index 4f6ac2a031..393491c8e9 100644
> --- a/doc/APIchanges
> +++ b/doc/APIchanges
> @@ -15,6 +15,9 @@ libavutil:     2017-10-21
>
>  API changes, most recent first:
>
> +2018-04-xx - xxxxxxxxxx - lavu 56.16.100 - threadmessage.h
> +  Add av_thread_message_queue_nelem().
> +
>  -------- 8< --------- FFmpeg 4.0 was cut here -------- 8< ---------
>
>  2018-04-03 - d6fc031caf - lavu 56.13.100 - pixdesc.h
> diff --git a/libavutil/threadmessage.c b/libavutil/threadmessage.c
> index 872e9392b1..fed398926a 100644
> --- a/libavutil/threadmessage.c
> +++ b/libavutil/threadmessage.c
> @@ -102,6 +102,15 @@ void av_thread_message_queue_free(AVThreadMessageQueue
> **mq)
>  #endif
>  }
>
> +int av_thread_message_queue_nelem(AVThreadMessageQueue *mq)
> +{
> +    int ret;
> +    pthread_mutex_lock(&mq->lock);
> +    ret = av_fifo_size(mq->fifo);
> +    pthread_mutex_unlock(&mq->lock);
> +    return ret / mq->elsize;
> +}
> +
>  #if HAVE_THREADS
>
>  static int av_thread_message_queue_send_locked(AVThreadMessageQueue *mq,
> diff --git a/libavutil/threadmessage.h b/libavutil/threadmessage.h
> index 8480a0a3db..e41d95ccf7 100644
> --- a/libavutil/threadmessage.h
> +++ b/libavutil/threadmessage.h
> @@ -95,6 +95,11 @@ void av_thread_message_queue_set_err_recv(AVThreadMessageQueue
> *mq,
>  void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq,
>                                             void (*free_func)(void *msg));
>
> +/**
> + * Return the current number of messages in the queue.
> + */
> +int av_thread_message_queue_nelem(AVThreadMessageQueue *mq);
> +
>  /**
>   * Flush the message queue
>   *
> diff --git a/libavutil/version.h b/libavutil/version.h
> index 387421775f..23567000a3 100644
> --- a/libavutil/version.h
> +++ b/libavutil/version.h
> @@ -79,7 +79,7 @@
>   */
>
>  #define LIBAVUTIL_VERSION_MAJOR  56
> -#define LIBAVUTIL_VERSION_MINOR  15
> +#define LIBAVUTIL_VERSION_MINOR  16
>  #define LIBAVUTIL_VERSION_MICRO 100
>
>  #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
> diff --git a/tests/api/api-threadmessage-test.c
> b/tests/api/api-threadmessage-test.c
> index 05a8062b8c..494808f176 100644
> --- a/tests/api/api-threadmessage-test.c
> +++ b/tests/api/api-threadmessage-test.c
> @@ -130,7 +130,9 @@ static void *receiver_thread(void *arg)
>
>      for (i = 0; i < rd->workload; i++) {
>          if (rand() % rd->workload < rd->workload / 10) {
> -            av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the
> queue\n", rd->id);
> +            av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the queue, "
> +                   "discarding %d message(s)\n", rd->id,
> +                   av_thread_message_queue_nelem(rd->queue));
>              av_thread_message_flush(rd->queue);
>          } else {
>              struct message msg;
> --
> 2.17.0
>
> _______________________________________________
> ffmpeg-devel mailing list
> ffmpeg-devel@ffmpeg.org
> http://ffmpeg.org/mailman/listinfo/ffmpeg-devel
>

I think av_thread_message_queue_elems would be a better name, had to think
for a good period of time what "nelem" meant.
diff mbox

Patch

diff --git a/doc/APIchanges b/doc/APIchanges
index 4f6ac2a031..393491c8e9 100644
--- a/doc/APIchanges
+++ b/doc/APIchanges
@@ -15,6 +15,9 @@  libavutil:     2017-10-21
 
 API changes, most recent first:
 
+2018-04-xx - xxxxxxxxxx - lavu 56.16.100 - threadmessage.h
+  Add av_thread_message_queue_nelem().
+
 -------- 8< --------- FFmpeg 4.0 was cut here -------- 8< ---------
 
 2018-04-03 - d6fc031caf - lavu 56.13.100 - pixdesc.h
diff --git a/libavutil/threadmessage.c b/libavutil/threadmessage.c
index 872e9392b1..fed398926a 100644
--- a/libavutil/threadmessage.c
+++ b/libavutil/threadmessage.c
@@ -102,6 +102,15 @@  void av_thread_message_queue_free(AVThreadMessageQueue **mq)
 #endif
 }
 
+int av_thread_message_queue_nelem(AVThreadMessageQueue *mq)
+{
+    int ret;
+    pthread_mutex_lock(&mq->lock);
+    ret = av_fifo_size(mq->fifo);
+    pthread_mutex_unlock(&mq->lock);
+    return ret / mq->elsize;
+}
+
 #if HAVE_THREADS
 
 static int av_thread_message_queue_send_locked(AVThreadMessageQueue *mq,
diff --git a/libavutil/threadmessage.h b/libavutil/threadmessage.h
index 8480a0a3db..e41d95ccf7 100644
--- a/libavutil/threadmessage.h
+++ b/libavutil/threadmessage.h
@@ -95,6 +95,11 @@  void av_thread_message_queue_set_err_recv(AVThreadMessageQueue *mq,
 void av_thread_message_queue_set_free_func(AVThreadMessageQueue *mq,
                                            void (*free_func)(void *msg));
 
+/**
+ * Return the current number of messages in the queue.
+ */
+int av_thread_message_queue_nelem(AVThreadMessageQueue *mq);
+
 /**
  * Flush the message queue
  *
diff --git a/libavutil/version.h b/libavutil/version.h
index 387421775f..23567000a3 100644
--- a/libavutil/version.h
+++ b/libavutil/version.h
@@ -79,7 +79,7 @@ 
  */
 
 #define LIBAVUTIL_VERSION_MAJOR  56
-#define LIBAVUTIL_VERSION_MINOR  15
+#define LIBAVUTIL_VERSION_MINOR  16
 #define LIBAVUTIL_VERSION_MICRO 100
 
 #define LIBAVUTIL_VERSION_INT   AV_VERSION_INT(LIBAVUTIL_VERSION_MAJOR, \
diff --git a/tests/api/api-threadmessage-test.c b/tests/api/api-threadmessage-test.c
index 05a8062b8c..494808f176 100644
--- a/tests/api/api-threadmessage-test.c
+++ b/tests/api/api-threadmessage-test.c
@@ -130,7 +130,9 @@  static void *receiver_thread(void *arg)
 
     for (i = 0; i < rd->workload; i++) {
         if (rand() % rd->workload < rd->workload / 10) {
-            av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the queue\n", rd->id);
+            av_log(NULL, AV_LOG_INFO, "receiver #%d: flushing the queue, "
+                   "discarding %d message(s)\n", rd->id,
+                   av_thread_message_queue_nelem(rd->queue));
             av_thread_message_flush(rd->queue);
         } else {
             struct message msg;