From patchwork Wed Dec 30 06:26:50 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Guo, Yejun" X-Patchwork-Id: 24686 Return-Path: X-Original-To: patchwork@ffaux-bg.ffmpeg.org Delivered-To: patchwork@ffaux-bg.ffmpeg.org Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org [79.124.17.100]) by ffaux.localdomain (Postfix) with ESMTP id 7E31644BD1E for ; Wed, 30 Dec 2020 08:28:14 +0200 (EET) Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 673F468A765; Wed, 30 Dec 2020 08:28:14 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mga05.intel.com (mga05.intel.com [192.55.52.43]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 9BB63689993 for ; Wed, 30 Dec 2020 08:28:07 +0200 (EET) IronPort-SDR: DxcHC1p0QnpcsZsYFaxKjmzwjApkh9TB3FCgIgehXHvkDRo+Ca+e9aw2QOirritASXXLfM6sLT D4Uu2ZimA6vg== X-IronPort-AV: E=McAfee;i="6000,8403,9849"; a="261328046" X-IronPort-AV: E=Sophos;i="5.78,460,1599548400"; d="scan'208";a="261328046" Received: from orsmga001.jf.intel.com ([10.7.209.18]) by fmsmga105.fm.intel.com with ESMTP/TLS/ECDHE-RSA-AES256-GCM-SHA384; 29 Dec 2020 22:28:05 -0800 IronPort-SDR: XglWCdoKYLQhXz44e6qAlmSUB3dXzd4SOK5vXlPZSi48RmP7QR5KjBhn5mHwJ2KTVTh64o8dfm IxQPdxwq5OUg== X-ExtLoop1: 1 X-IronPort-AV: E=Sophos;i="5.78,460,1599548400"; d="scan'208";a="419435026" Received: from yguo18-skl-u1604.sh.intel.com ([10.239.159.53]) by orsmga001.jf.intel.com with ESMTP; 29 Dec 2020 22:28:03 -0800 From: "Guo, Yejun" To: ffmpeg-devel@ffmpeg.org Date: Wed, 30 Dec 2020 14:26:50 +0800 Message-Id: <20201230062650.29612-1-yejun.guo@intel.com> X-Mailer: git-send-email 2.17.1 Subject: [FFmpeg-devel] [PATCH 3/3] dnn/queue: add error check and cleanup X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.20 Precedence: list List-Id: FFmpeg development discussions and patches List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Reply-To: FFmpeg development discussions and patches Cc: yejun.guo@intel.com MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Signed-off-by: Guo, Yejun --- libavfilter/dnn/dnn_backend_openvino.c | 16 ++++++++++++--- libavfilter/dnn/queue.c | 28 ++++++++++++++++++++------ libavfilter/dnn/queue.h | 4 ++-- libavfilter/dnn/safe_queue.c | 16 ++++++++++----- libavfilter/dnn/safe_queue.h | 4 ++-- 5 files changed, 50 insertions(+), 18 deletions(-) diff --git a/libavfilter/dnn/dnn_backend_openvino.c b/libavfilter/dnn/dnn_backend_openvino.c index a35d72a38c..5dc855d0d9 100644 --- a/libavfilter/dnn/dnn_backend_openvino.c +++ b/libavfilter/dnn/dnn_backend_openvino.c @@ -208,7 +208,10 @@ static void infer_completion_callback(void *args) if (task->async) { request->task = NULL; - safe_queue_push_back(task->ov_model->request_queue, request); + if (safe_queue_push_back(task->ov_model->request_queue, request) < 0) { + av_log(ctx, AV_LOG_ERROR, "Failed to push back request_queue.\n"); + return; + } } task->done = 1; @@ -436,7 +439,10 @@ DNNModel *ff_dnn_load_model_ov(const char *model_filename, const char *options, item->infer_request = request; item->callback.completeCallBackFunc = infer_completion_callback; item->callback.args = item; - safe_queue_push_back(ov_model->request_queue, item); + if (safe_queue_push_back(ov_model->request_queue, item) < 0) { + av_freep(&item); + goto err; + } } ov_model->task_queue = queue_create(); @@ -527,7 +533,11 @@ DNNReturnType ff_dnn_execute_model_async_ov(const DNNModel *model, const char *i task->output_name = output_names[0]; task->out_frame = out_frame; task->ov_model = ov_model; - queue_push_back(ov_model->task_queue, task); + if (queue_push_back(ov_model->task_queue, task) < 0) { + av_freep(&task); + av_log(ctx, AV_LOG_ERROR, "unable to push back task_queue.\n"); + return DNN_ERROR; + } request = safe_queue_pop_front(ov_model->request_queue); if (!request) { diff --git a/libavfilter/dnn/queue.c b/libavfilter/dnn/queue.c index da0517968d..51e24b76d3 100644 --- a/libavfilter/dnn/queue.c +++ b/libavfilter/dnn/queue.c @@ -40,8 +40,8 @@ struct _queue_entry { static inline queue_entry *create_entry(void *val) { queue_entry *entry = av_malloc(sizeof(*entry)); - av_assert0(entry != NULL); - entry->value = val; + if (entry) + entry->value = val; return entry; } @@ -53,6 +53,14 @@ queue* queue_create(void) q->head = create_entry(q); q->tail = create_entry(q); + + if (!q->head || !q->tail) { + av_freep(&q->head); + av_freep(&q->tail); + av_freep(&q); + return NULL; + } + q->head->next = q->tail; q->tail->prev = q->head; q->head->prev = NULL; @@ -99,14 +107,16 @@ void *queue_peek_back(queue *q) return q->tail->prev->value; } -void queue_push_front(queue *q, void *v) +int queue_push_front(queue *q, void *v) { queue_entry *new_entry; queue_entry *original_next; if (!q) - return; + return 0; new_entry = create_entry(v); + if (!new_entry) + return -1; original_next = q->head->next; q->head->next = new_entry; @@ -114,16 +124,20 @@ void queue_push_front(queue *q, void *v) new_entry->prev = q->head; new_entry->next = original_next; q->length++; + + return q->length; } -void queue_push_back(queue *q, void *v) +int queue_push_back(queue *q, void *v) { queue_entry *new_entry; queue_entry *original_prev; if (!q) - return; + return 0; new_entry = create_entry(v); + if (!new_entry) + return -1; original_prev = q->tail->prev; q->tail->prev = new_entry; @@ -131,6 +145,8 @@ void queue_push_back(queue *q, void *v) new_entry->next = q->tail; new_entry->prev = original_prev; q->length++; + + return q->length; } void *queue_pop_front(queue *q) diff --git a/libavfilter/dnn/queue.h b/libavfilter/dnn/queue.h index 75f42f403b..58fb416001 100644 --- a/libavfilter/dnn/queue.h +++ b/libavfilter/dnn/queue.h @@ -32,8 +32,8 @@ size_t queue_size(queue *q); void *queue_peek_front(queue *q); void *queue_peek_back(queue *q); -void queue_push_front(queue *q, void *v); -void queue_push_back(queue *q, void *v); +int queue_push_front(queue *q, void *v); +int queue_push_back(queue *q, void *v); void *queue_pop_front(queue *q); void *queue_pop_back(queue *q); diff --git a/libavfilter/dnn/safe_queue.c b/libavfilter/dnn/safe_queue.c index 4f47e68fb3..b2a2ca5a46 100644 --- a/libavfilter/dnn/safe_queue.c +++ b/libavfilter/dnn/safe_queue.c @@ -56,8 +56,10 @@ safe_queue *safe_queue_create(void) return NULL; sq->q = queue_create(); - if (!sq->q) + if (!sq->q) { + av_freep(&sq); return NULL; + } ff_mutex_init(&sq->mutex, NULL); dnn_cond_init(&sq->cond, NULL); @@ -80,20 +82,24 @@ size_t safe_queue_size(safe_queue *sq) return sq ? queue_size(sq->q) : 0; } -void safe_queue_push_front(safe_queue *sq, void *v) +int safe_queue_push_front(safe_queue *sq, void *v) { + int ret; ff_mutex_lock(&sq->mutex); - queue_push_front(sq->q, v); + ret = queue_push_front(sq->q, v); dnn_cond_signal(&sq->cond); ff_mutex_unlock(&sq->mutex); + return ret; } -void safe_queue_push_back(safe_queue *sq, void *v) +int safe_queue_push_back(safe_queue *sq, void *v) { + int ret; ff_mutex_lock(&sq->mutex); - queue_push_back(sq->q, v); + ret = queue_push_back(sq->q, v); dnn_cond_signal(&sq->cond); ff_mutex_unlock(&sq->mutex); + return ret; } void *safe_queue_pop_front(safe_queue *sq) diff --git a/libavfilter/dnn/safe_queue.h b/libavfilter/dnn/safe_queue.h index aaa15fadf2..64e90880e8 100644 --- a/libavfilter/dnn/safe_queue.h +++ b/libavfilter/dnn/safe_queue.h @@ -28,8 +28,8 @@ void safe_queue_destroy(safe_queue *sq); size_t safe_queue_size(safe_queue *sq); -void safe_queue_push_front(safe_queue *sq, void *v); -void safe_queue_push_back(safe_queue *sq, void *v); +int safe_queue_push_front(safe_queue *sq, void *v); +int safe_queue_push_back(safe_queue *sq, void *v); void *safe_queue_pop_front(safe_queue *sq);