[PR] avfilter/dnn: fix race when querying queue length (PR #23918)

guoyejun via ffmpeg-devel <[email protected]> Sun, 26 Jul 2026 08:32:43 -0000
Newsgroups gmane.comp.video.ffmpeg.devel
Message-ID <178505476382.59.11121693960891532865@29965ddac10e>
PR #23918 opened by guoyejun
URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23918
Patch URL: https://code.ffmpeg.org/FFmpeg/FFmpeg/pulls/23918.patch

Replace av_usleep polling with a condition variable wait.


>From fa3444d25cdb456d1e8e8b4acbc36d1e18348d30 Mon Sep 17 00:00:00 2001
From: Guo Yejun <[email protected]>
Date: Sun, 26 Jul 2026 16:25:58 +0800
Subject: [PATCH] avfilter/dnn: fix race when querying queue length

Replace av_usleep polling with a condition variable wait.
---
 libavfilter/dnn/dnn_backend_common.c |  5 ++---
 libavfilter/dnn/safe_queue.c         | 11 +++++++++++
 libavfilter/dnn/safe_queue.h         |  8 ++++++++
 3 files changed, 21 insertions(+), 3 deletions(-)

diff --git a/libavfilter/dnn/dnn_backend_common.c b/libavfilter/dnn/dnn_backend_common.c
index 4d6752ae33..82627c7a96 100644
--- a/libavfilter/dnn/dnn_backend_common.c
+++ b/libavfilter/dnn/dnn_backend_common.c
@@ -22,7 +22,6 @@
  */
 
 #include "libavutil/mem.h"
-#include "libavutil/time.h"
 #include "dnn_backend_common.h"
 
 #define DNN_ASYNC_SUCCESS (void *)0
@@ -107,8 +106,8 @@ void ff_dnn_wait_requests(SafeQueue *request_queue, int nireq)
 {
     if (!request_queue)
         return;
-    while (ff_safe_queue_size(request_queue) < nireq)
-        av_usleep(10000);
+
+    ff_safe_queue_wait_for_size(request_queue, nireq);
 }
 
 int ff_dnn_start_inference_async(void *ctx, DNNAsyncExecModule *async_module)
diff --git a/libavfilter/dnn/safe_queue.c b/libavfilter/dnn/safe_queue.c
index e962d4cb7e..f7aa31d42e 100644
--- a/libavfilter/dnn/safe_queue.c
+++ b/libavfilter/dnn/safe_queue.c
@@ -82,6 +82,17 @@ size_t ff_safe_queue_size(SafeQueue *sq)
     return sq ? ff_queue_size(sq->q) : 0;
 }
 
+void ff_safe_queue_wait_for_size(SafeQueue *sq, size_t min_size)
+{
+    if (!sq)
+        return;
+
+    ff_mutex_lock(&sq->mutex);
+    while (ff_queue_size(sq->q) < min_size)
+        dnn_cond_wait(&sq->cond, &sq->mutex);
+    ff_mutex_unlock(&sq->mutex);
+}
+
 int ff_safe_queue_push_front(SafeQueue *sq, void *v)
 {
     int ret;
diff --git a/libavfilter/dnn/safe_queue.h b/libavfilter/dnn/safe_queue.h
index 577a02e24d..b0b32d90e0 100644
--- a/libavfilter/dnn/safe_queue.h
+++ b/libavfilter/dnn/safe_queue.h
@@ -47,6 +47,14 @@ void ff_safe_queue_destroy(SafeQueue *sq);
  */
 size_t ff_safe_queue_size(SafeQueue *sq);
 
+/**
+ * @brief Wait until queue length reaches at least min_size.
+ *
+ * @param sq pointer to the SafeQueue
+ * @param min_size target queue length
+ */
+void ff_safe_queue_wait_for_size(SafeQueue *sq, size_t min_size);
+
 /**
  * @brief Add data to the head of queue in the
  * SafeQueue after locking mutex. After adding
-- 
2.52.0

_______________________________________________
ffmpeg-devel mailing list -- [email protected]
To unsubscribe send an email to [email protected]