diff mbox

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

Message ID 20180422073303.GC28540@golem.pkh.me
State New
Headers show

Commit Message

Clément Bœsch April 22, 2018, 7:33 a.m. UTC
On Sun, Apr 22, 2018 at 02:51:16AM +0100, Rostislav Pehlivanov wrote:
[...]
> I think av_thread_message_queue_elems would be a better name, had to think
> for a good period of time what "nelem" meant.

I'm afraid of "queue_elems" implying "queuing elements" so I went for
the more explicit av_thread_message_queue_nb_elems() instead.

Also fixed the problem raised by Michael.

Comments

Marton Balint April 22, 2018, 10:33 a.m. UTC | #1
On Sun, 22 Apr 2018, Clément Bœsch wrote:

> On Sun, Apr 22, 2018 at 02:51:16AM +0100, Rostislav Pehlivanov wrote:
> [...]
>> I think av_thread_message_queue_elems would be a better name, had to think
>> for a good period of time what "nelem" meant.
>
> I'm afraid of "queue_elems" implying "queuing elements" so I went for
> the more explicit av_thread_message_queue_nb_elems() instead.

I generally prefer nb_items instead of nb_elems. Use whichever you like.

Thanks,
Marton
Clément Bœsch April 22, 2018, 4:32 p.m. UTC | #2
On Sun, Apr 22, 2018 at 12:33:14PM +0200, Marton Balint wrote:
> 
> 
> On Sun, 22 Apr 2018, Clément Bœsch wrote:
> 
> > On Sun, Apr 22, 2018 at 02:51:16AM +0100, Rostislav Pehlivanov wrote:
> > [...]
> > > I think av_thread_message_queue_elems would be a better name, had to think
> > > for a good period of time what "nelem" meant.
> > 
> > I'm afraid of "queue_elems" implying "queuing elements" so I went for
> > the more explicit av_thread_message_queue_nb_elems() instead.
> 
> I generally prefer nb_items instead of nb_elems. Use whichever you like.
> 

No personal opinion on this but the "element" semantic is already in use
in the API so I'd rather follow that.
Michael Niedermayer April 23, 2018, 12:13 a.m. UTC | #3
On Sun, Apr 22, 2018 at 09:33:04AM +0200, Clément Bœsch wrote:
> On Sun, Apr 22, 2018 at 02:51:16AM +0100, Rostislav Pehlivanov wrote:
> [...]
> > I think av_thread_message_queue_elems would be a better name, had to think
> > for a good period of time what "nelem" meant.
> 
> I'm afraid of "queue_elems" implying "queuing elements" so I went for
> the more explicit av_thread_message_queue_nb_elems() instead.
> 

> Also fixed the problem raised by Michael.

confirmed

[...]
> diff --git a/libavutil/threadmessage.h b/libavutil/threadmessage.h
> index 8480a0a3db..7ebf03a8ac 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.
> + */

doesnt document the AVERROR case

should be ok otherwise, no more comments from me

thx
also welcome back !

[...]
Clément Bœsch April 26, 2018, 5:53 p.m. UTC | #4
On Mon, Apr 23, 2018 at 02:13:41AM +0200, Michael Niedermayer wrote:
[...]
> doesnt document the AVERROR case
> 

added

> should be ok otherwise, no more comments from me
> 

thx, applied
diff mbox

Patch

diff --git a/doc/APIchanges b/doc/APIchanges
index 4f6ac2a031..8d305d5867 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_nb_elems().
+
 -------- 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..764b7fb813 100644
--- a/libavutil/threadmessage.c
+++ b/libavutil/threadmessage.c
@@ -102,6 +102,19 @@  void av_thread_message_queue_free(AVThreadMessageQueue **mq)
 #endif
 }
 
+int av_thread_message_queue_nb_elems(AVThreadMessageQueue *mq)
+{
+#if HAVE_THREADS
+    int ret;
+    pthread_mutex_lock(&mq->lock);
+    ret = av_fifo_size(mq->fifo);
+    pthread_mutex_unlock(&mq->lock);
+    return ret / mq->elsize;
+#else
+    return AVERROR(ENOSYS);
+#endif
+}
+
 #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..7ebf03a8ac 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_nb_elems(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..3c693a70d1 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_nb_elems(rd->queue));
             av_thread_message_flush(rd->queue);
         } else {
             struct message msg;