From patchwork Fri Nov 19 12:48:05 2021 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Liu Steven X-Patchwork-Id: 31488 Delivered-To: ffmpegpatchwork2@gmail.com Received: by 2002:a6b:d206:0:0:0:0:0 with SMTP id q6csp2330820iob; Fri, 19 Nov 2021 04:48:28 -0800 (PST) X-Google-Smtp-Source: ABdhPJyQ+ePQAlkOaDwwE946afUU/upmM3czjNkBaB+c55m2WwfytluhTN0MN23ckaOOLlE1WrjI X-Received: by 2002:a05:6402:445:: with SMTP id p5mr25150442edw.110.1637326107702; Fri, 19 Nov 2021 04:48:27 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1637326107; cv=none; d=google.com; s=arc-20160816; b=zoOLhfrvz2PpOWqpaH/u+kuMk7C+weztIELgswH3l1Rhqka5gCK5w8ekRZqq5KsxSN 850XnK4uFXzhi94IB/CsEHzqxjDGt5Xuz7cCsE6gh0d2BEKBl3IiX9F15IvrLsqlJDnr ZHa24TT9Z+Vz1NFEV+eyTi20eyHGmgqjZopwld4OOBrzCfslPTue6rYjcKUEJx1NmneN EXWlAWdLvVtnEcRIfCtxv3K5ljK2R47kSszAdIzBv12Z+SWQu3GCxRCVdGqG/Sz0LMxk MMx4uLxocYqWZTnpHVMY15XAumTDb/rVnZAVIuXbYGRqxj+JqE//St0rYbmeaXwqvEoL R/fQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:feedback-id:mime-version:message-id:date :to:from:delivered-to; bh=rtztHLpgbwr+YIPfZruX7fbpXoUtIR24JAhU8+1HX4A=; b=Vh8Qfi7uHYh5sHK2bIUCXt2QSQaZOFRkqe9C1Cip/Ak3bErVsM//K0Ivi6bAjM9EMR 9TW0PORDx/0cmB1wHvnmOY4ZXX0KbDUCrtdaZmvaD9qomBeBPG1tAXcWpSpqhj5DDdvc 7Zu1ZUew0wDE/mGLfDM6fky2SFXdpqY+GIaF4ttssYciB+bS5wNotQIRtUavOBGZwE+q wTtRvPvnlk2JslcJ9/D/BcckZPzIHfWLRei1NLPutiRY0PolzlS4KtT97AHopx87YzWW zvBJ9Zoh7/lC9fFHUkQRFCInCgNn6TvVGafE2xHSKfAZUy16SY7utcGzeolCEKmwuRIO HkAA== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id b15si8548292edz.556.2021.11.19.04.48.26; Fri, 19 Nov 2021 04:48:27 -0800 (PST) Received-SPF: pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) client-ip=79.124.17.100; Authentication-Results: mx.google.com; spf=pass (google.com: domain of ffmpeg-devel-bounces@ffmpeg.org designates 79.124.17.100 as permitted sender) smtp.mailfrom=ffmpeg-devel-bounces@ffmpeg.org Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 9E361680134; Fri, 19 Nov 2021 14:48:22 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from smtpbg587.qq.com (smtpbg128.qq.com [106.55.201.39]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id F09466880AF for ; Fri, 19 Nov 2021 14:48:14 +0200 (EET) X-QQ-mid: bizesmtp39t1637326088tl3g21wk Received: from localhost (unknown [103.107.216.231]) by esmtp6.qq.com (ESMTP) with id ; Fri, 19 Nov 2021 20:48:07 +0800 (CST) X-QQ-SSF: 01100000002000Z0Z000B00A0000000 X-QQ-FEAT: qcTrRe6pcblO9dRPyzZOJmYq2FOjgEYTfO4Ug4zTGqLyXH0HO5ZfMQY8G+lHp QPeWglrx/2YxAGkd524/tEujfJ6eT1p2hX1XoY6VlIYjaE1a174IoybHOAELd/fNj6KQxfN QVeWCRreR3j23jLyr8QVcgnMJQUFAO7azHwlTinXr8czOptuXGgGw97yL+iIG06WgMxI2b0 GEPAzitIW4/68b7SOH3vfZaVFKRKfbonIxUrSNBgIm4xGFG9/5OfX7/+hdyBbkLTKxsDVzS tUSz065D+M4OTPMZE+P2Xb2s3RIH0O09FUm3YgxAXqQ3Pf2MQa2qd5bAkj1bboq0XF0UGof KPQsNt/ X-QQ-GoodBg: 0 From: Steven Liu To: ffmpeg-devel@ffmpeg.org Date: Fri, 19 Nov 2021 20:48:05 +0800 Message-Id: <20211119124805.77429-1-lq@chinaffmpeg.org> X-Mailer: git-send-email 2.25.0 MIME-Version: 1.0 X-QQ-SENDSIZE: 520 Feedback-ID: bizesmtp:chinaffmpeg.org:qybgspam:qybgspam5 Subject: [FFmpeg-devel] [PATCH] avfilter/dnn/dnn_backend_common: check thread create status before join thread X-BeenThere: ffmpeg-devel@ffmpeg.org X-Mailman-Version: 2.1.29 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: Steven Liu , Yu Yang Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" X-TUID: b4tdtY22Ec+a From: Steven Liu fix SIGSEGV problem, check the thread create status before join thread. set the init status to 0 when create DNNAsyncExecModule, and set status to 1 after pthread_create success. coredump backtrace info: [Thread 0x7fff4778e700 (LWP 323218) exited] Program received signal SIGSEGV, Segmentation fault. 0x00007fffed71af81 in pthread_join () from /lib64/libpthread.so.0 (gdb) bt 0 0x00007fffed71af81 in pthread_join () from /lib64/libpthread.so.0 1 0x0000000000872e3a in ff_dnn_start_inference_async (ctx=0x30cbe80, async_module=0x4848c58) at libavfilter/dnn/dnn_backend_common.c:122 2 0x0000000000870f70 in execute_model_tf (request=0x4848c40, lltask_queue=0x484c7c0) at libavfilter/dnn/dnn_backend_tf.c:1111 3 0x0000000000871195 in ff_dnn_execute_model_tf (model=0x30c9700, exec_params=0x7fffffffafb0) at libavfilter/dnn/dnn_backend_tf.c:1168 4 0x000000000084a475 in ff_dnn_execute_model (ctx=0x30f8388, in_frame=0x4890fc0, out_frame=0x485f780) at libavfilter/dnn_filter_common.c:129 5 0x0000000000524d69 in activate (filter_ctx=0x3100a40) at libavfilter/vf_dnn_processing.c:299 6 0x000000000046bc68 in ff_filter_activate (filter=0x3100a40) at libavfilter/avfilter.c:1364 7 0x00000000004701fd in ff_filter_graph_run_once (graph=0x3114cc0) at libavfilter/avfiltergraph.c:1341 8 0x0000000000471331 in push_frame (graph=0x3114cc0) at libavfilter/buffersrc.c:156 9 0x0000000000471861 in av_buffersrc_add_frame_flags (ctx=0x484ce00, frame=0x41670c0, flags=4) at libavfilter/buffersrc.c:224 10 0x000000000042d415 in ifilter_send_frame (ifilter=0x314e300, frame=0x41670c0) at fftools/ffmpeg.c:2249 11 0x000000000042d682 in send_frame_to_filters (ist=0x30ff1c0, decoded_frame=0x41670c0) at fftools/ffmpeg.c:2323 12 0x000000000042e3b5 in decode_video (ist=0x30ff1c0, pkt=0x30b0b40, got_output=0x7fffffffb524, duration_pts=0x7fffffffb528, eof=0, decode_failed=0x7fffffffb520) at fftools/ffmpeg.c:2525 13 0x000000000042ecd4 in process_input_packet (ist=0x30ff1c0, pkt=0x3148cc0, no_eof=0) at fftools/ffmpeg.c:2681 14 0x0000000000435b2d in process_input (file_index=0) at fftools/ffmpeg.c:4579 15 0x0000000000435fe8 in transcode_step () at fftools/ffmpeg.c:4719 16 0x000000000043610b in transcode () at fftools/ffmpeg.c:4773 17 0x00000000004368a7 in main (argc=8, argv=0x7fffffffbd68) at fftools/ffmpeg.c:4977 Reported-by: Yu Yang Signed-off-by: Steven Liu Reported-by: Yu Yang Signed-off-by: Steven Liu --- libavfilter/dnn/dnn_backend_common.c | 23 +++++++++++++++-------- libavfilter/dnn/dnn_backend_common.h | 1 + libavfilter/dnn/dnn_backend_tf.c | 4 +++- 3 files changed, 19 insertions(+), 9 deletions(-) diff --git a/libavfilter/dnn/dnn_backend_common.c b/libavfilter/dnn/dnn_backend_common.c index 6a9c4cc87f..a25d0eded1 100644 --- a/libavfilter/dnn/dnn_backend_common.c +++ b/libavfilter/dnn/dnn_backend_common.c @@ -96,10 +96,13 @@ DNNReturnType ff_dnn_async_module_cleanup(DNNAsyncExecModule *async_module) return DNN_ERROR; } #if HAVE_PTHREAD_CANCEL - pthread_join(async_module->thread_id, &status); - if (status == DNN_ASYNC_FAIL) { - av_log(NULL, AV_LOG_ERROR, "Last Inference Failed.\n"); - return DNN_ERROR; + if (async_module->thread_created) { + pthread_join(async_module->thread_id, &status); + if (status == DNN_ASYNC_FAIL) { + av_log(NULL, AV_LOG_ERROR, "Last Inference Failed.\n"); + return DNN_ERROR; + } + async_module->thread_created = 0; } #endif async_module->start_inference = NULL; @@ -119,16 +122,20 @@ DNNReturnType ff_dnn_start_inference_async(void *ctx, DNNAsyncExecModule *async_ } #if HAVE_PTHREAD_CANCEL - pthread_join(async_module->thread_id, &status); - if (status == DNN_ASYNC_FAIL) { - av_log(ctx, AV_LOG_ERROR, "Unable to start inference as previous inference failed.\n"); - return DNN_ERROR; + if (async_module->thread_created) { + pthread_join(async_module->thread_id, &status); + if (status == DNN_ASYNC_FAIL) { + av_log(ctx, AV_LOG_ERROR, "Unable to start inference as previous inference failed.\n"); + return DNN_ERROR; + } + async_module->thread_created = 0; } ret = pthread_create(&async_module->thread_id, NULL, async_thread_routine, async_module); if (ret != 0) { av_log(ctx, AV_LOG_ERROR, "Unable to start async inference.\n"); return DNN_ERROR; } + async_module->thread_created = 1; #else if (async_module->start_inference(async_module->args) != DNN_SUCCESS) { return DNN_ERROR; diff --git a/libavfilter/dnn/dnn_backend_common.h b/libavfilter/dnn/dnn_backend_common.h index 6b6a5e21ae..6c4909a489 100644 --- a/libavfilter/dnn/dnn_backend_common.h +++ b/libavfilter/dnn/dnn_backend_common.h @@ -75,6 +75,7 @@ typedef struct DNNAsyncExecModule { */ void *args; #if HAVE_PTHREAD_CANCEL + int thread_created; pthread_t thread_id; pthread_attr_t thread_attr; #endif diff --git a/libavfilter/dnn/dnn_backend_tf.c b/libavfilter/dnn/dnn_backend_tf.c index 7dd48fb612..644c794612 100644 --- a/libavfilter/dnn/dnn_backend_tf.c +++ b/libavfilter/dnn/dnn_backend_tf.c @@ -912,7 +912,9 @@ DNNModel *ff_dnn_load_model_tf(const char *model_filename, DNNFunctionType func_ item->exec_module.start_inference = &tf_start_inference; item->exec_module.callback = &infer_completion_callback; item->exec_module.args = item; - +#if HAVE_PTHREAD_CANCEL + item->exec_module.thread_created = 0; +#endif if (ff_safe_queue_push_back(tf_model->request_queue, item) < 0) { destroy_request_item(&item); goto err;