From patchwork Fri Mar 31 14:20:43 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: "Ronald S. Bultje" X-Patchwork-Id: 3221 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp2068538vss; Fri, 31 Mar 2017 07:27:54 -0700 (PDT) X-Received: by 10.28.173.2 with SMTP id w2mr3615195wme.117.1490970474744; Fri, 31 Mar 2017 07:27:54 -0700 (PDT) Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id y23si3673255wmh.97.2017.03.31.07.27.54; Fri, 31 Mar 2017 07:27:54 -0700 (PDT) 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; dkim=neutral (body hash did not verify) header.i=@gmail.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; dmarc=fail (p=NONE sp=NONE dis=NONE) header.from=gmail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 2F3816899CD; Fri, 31 Mar 2017 17:27:51 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qt0-f169.google.com (mail-qt0-f169.google.com [209.85.216.169]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id D716F6883B2 for ; Fri, 31 Mar 2017 17:27:44 +0300 (EEST) Received: by mail-qt0-f169.google.com with SMTP id r45so66553523qte.3 for ; Fri, 31 Mar 2017 07:27:45 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gmail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=5vdOgjP235cs8LFWG1SNWu9WhKpf2RUrWIk/ADHyBdQ=; b=jVwJVXcBU0Ypo2BxOdDQLmpyz6zCuziWaylr6cXy79jBDDI+h3515R2AurXkw8BB/8 5vPzIPkaeJt/DbFarJ3MYbWcL/WG6bnPbXkYm8l3Uk/Hpqn7g/xAQMxhFIVEoCHtZ/ll cinwMBIJEt1i6xFINpzhXieiSBw9IdKaWj4rHRGAEik2q5+O9vIvQfVOMPvowWeT3mwe 8XgbW3Z26WzCDuzCEyoNzs3aNpfjBmnIr7mhD1y3g0kdidenRO5hIFdUNqN7IZeDcwj9 EmotIpPmN7gEb2YJlm9qLUZBej0c07M30+1F89Kshtg8EZ1zz02iLJbqXpQCdiS+iIOo Q30w== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=5vdOgjP235cs8LFWG1SNWu9WhKpf2RUrWIk/ADHyBdQ=; b=JqhzqvQrRqrDqdgXa31vgrgP2l07OyWGYvTEOwBGw+iNM6jR+HoanFKnlYOWe637hE LN68fvBaZB0D8IMJYLYsP8FQgLIu27I5FbaNKmQ+eU+OCX8Mbhxfgh5h8YYlYxyvf/ZU IA0YVXWAQrlwjQht6LaAS3wtdJPGVadZUTIvROi+JoE31M9kzEO03oU7aNGHAvE4rlXq d4LGFnZPFU0BIWTewa09JWV1XfWPNINpOZCMLL94uP6Gf6hbmHeFcVlua6CaA8m+eJ8g n/AyYr6m+RsXX7TdhG3YXTBw/32TkrwYe2iMnOjtVyB4AJantFv9BUQhiKf25MQ27Ogk wkOw== X-Gm-Message-State: AFeK/H3Jr38QEqC2sjVFB8k9Irmi33nZwfqqMH/qSvgsmg/lniiAS4WgSi/BB54T0IpAqQ== X-Received: by 10.200.44.57 with SMTP id d54mr3242899qta.59.1490970045059; Fri, 31 Mar 2017 07:20:45 -0700 (PDT) Received: from localhost.localdomain ([65.206.95.146]) by smtp.gmail.com with ESMTPSA id p184sm3611449qkb.17.2017.03.31.07.20.44 (version=TLS1 cipher=AES128-SHA bits=128/128); Fri, 31 Mar 2017 07:20:44 -0700 (PDT) From: "Ronald S. Bultje" To: ffmpeg-devel@ffmpeg.org Date: Fri, 31 Mar 2017 10:20:43 -0400 Message-Id: <1490970043-57594-1-git-send-email-rsbultje@gmail.com> X-Mailer: git-send-email 2.8.1 In-Reply-To: <20170331140218.GB4714@nb4> References: <20170331140218.GB4714@nb4> Subject: [FFmpeg-devel] [PATCH] frame_thread_encoder: make task indexing deterministic. 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: "Ronald S. Bultje" MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" Fixes tsan warnings in fate-utvideoenc. Example warning from utvideoenc_rgb_left: WARNING: ThreadSanitizer: data race (pid=19929) Read of size 8 at 0x7d840001cf18 by main thread: #0 ff_thread_video_encode_frame src/libavcodec/frame_thread_encoder.c:276 (ffmpeg+0x00000136a39d) #1 avcodec_encode_video2 src/libavcodec/utils.c:1986 (ffmpeg+0x000000f34a18) [..] Previous write of size 8 at 0x7d840001cf18 by thread T14 (mutexes: write M1348): #0 worker src/libavcodec/frame_thread_encoder.c:100 (ffmpeg+0x000001369964) We prevent that by using the same mechanism as frame-mt decoding, and assuming that we're encoding N packets in parallel (where N=n_threads), and thus the first N calls to encode_video() won't produce a packet. --- libavcodec/frame_thread_encoder.c | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/libavcodec/frame_thread_encoder.c b/libavcodec/frame_thread_encoder.c index 27ae356..8db9290 100644 --- a/libavcodec/frame_thread_encoder.c +++ b/libavcodec/frame_thread_encoder.c @@ -251,6 +251,7 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF ThreadContext *c = avctx->internal->frame_thread_encoder; Task task; int ret; + unsigned idx; av_assert1(!*got_packet_ptr); @@ -264,32 +265,33 @@ int ff_thread_video_encode_frame(AVCodecContext *avctx, AVPacket *pkt, const AVF return ret; } - task.index = c->task_index; + task.index = c->task_index % BUFFER_SIZE; task.indata = (void*)new; pthread_mutex_lock(&c->task_fifo_mutex); av_fifo_generic_write(c->task_fifo, &task, sizeof(task), NULL); pthread_cond_signal(&c->task_fifo_cond); pthread_mutex_unlock(&c->task_fifo_mutex); - c->task_index = (c->task_index+1) % BUFFER_SIZE; + c->task_index++; - if(!c->finished_tasks[c->finished_task_index].outdata && (c->task_index - c->finished_task_index) % BUFFER_SIZE <= avctx->thread_count) + if (c->task_index - c->finished_task_index < avctx->thread_count) return 0; } if(c->task_index == c->finished_task_index) return 0; + idx = c->finished_task_index % BUFFER_SIZE; pthread_mutex_lock(&c->finished_task_mutex); - while (!c->finished_tasks[c->finished_task_index].outdata) { + while (!c->finished_tasks[idx].outdata) { pthread_cond_wait(&c->finished_task_cond, &c->finished_task_mutex); } - task = c->finished_tasks[c->finished_task_index]; + task = c->finished_tasks[idx]; *pkt = *(AVPacket*)(task.outdata); if(pkt->data) *got_packet_ptr = 1; - av_freep(&c->finished_tasks[c->finished_task_index].outdata); - c->finished_task_index = (c->finished_task_index+1) % BUFFER_SIZE; + av_freep(&c->finished_tasks[idx].outdata); + c->finished_task_index++; pthread_mutex_unlock(&c->finished_task_mutex); return task.return_code;