[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]