From patchwork Sat Mar 18 08:55:59 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 2995 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.50.79 with SMTP id y76csp609711vsy; Sat, 18 Mar 2017 01:56:40 -0700 (PDT) X-Received: by 10.223.176.87 with SMTP id g23mr16026197wra.12.1489827400873; Sat, 18 Mar 2017 01:56:40 -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 130si6533271wmf.4.2017.03.18.01.56.40; Sat, 18 Mar 2017 01:56:40 -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=@googlemail.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=QUARANTINE sp=QUARANTINE dis=NONE) header.from=googlemail.com Received: from [127.0.1.1] (localhost [127.0.0.1]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTP id 66639688379; Sat, 18 Mar 2017 10:56:06 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f65.google.com (mail-wm0-f65.google.com [74.125.82.65]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 772E0688302 for ; Sat, 18 Mar 2017 10:55:59 +0200 (EET) Received: by mail-wm0-f65.google.com with SMTP id n11so6531924wma.0 for ; Sat, 18 Mar 2017 01:56:17 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=googlemail.com; s=20161025; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=sC2aqtAKLnXQ+ja8vRBUmYnO4H0lsgCMI5RgAw5glZk=; b=AdByPFZvA+/2q7YHkREONxTT0fkk8KWTQl1W0pGoabQlobwxcXRUCpgxiDomi/Kf5a 0n2mVOuZ2712URvRFTF82l6Gpm8BOCwmPMCLz0PS2tkU6SYTZ9AlstsdjkSk2C6137EG HvWu4+Almv/wmq+OOF6T6m682vExE1HMuFUiJi696i31nWVYph0SKR3tctvkYbi1d8ve 38EG/9NJOPkPr/Sddqd6sRbVsJTTxmpZAq0JDat1hR2XvaHT6SGpXb3AWZWVmQgMwcPv Z07ecEnTbOvYoloUjpRiyo8ertJhJfhUDpeVB4EIDcONHc/1W4Y5Q93db9swPkrC9Yeb 4oFw== 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=sC2aqtAKLnXQ+ja8vRBUmYnO4H0lsgCMI5RgAw5glZk=; b=XCHIEN8lDiUB//oPkcXDjJ609aO88Uhdg+V3ZQzH2nAcaY6x9Fqlbp1v7lLuzYfPLv G+bajTabFMcvZCdgU1QB+/M36M/BZc495VOUziUdhoSZBBiG41C9azKbUOL+TYUDAYuV PGe3HYTIijiQNtI/8vxgme2vj3OEeal1KFTeesUP+8Quk65s6D2itTx515fPYBjzpB1Q wDQzD/W08WjO0rse82EXLbDGNans8tckuf9vFs3YvGZ2XdK+gY1ti+G5N2bQnNeGD12p 7jZIFxaSxZ50nILvFnGQYAnendzWrHYBC3NuSgSp/0FquLF+1XF42ODo3DUURjbdlbyB AJ3Q== X-Gm-Message-State: AFeK/H0wEuxXbrfWmiRv+eQt8W8TOEbrvF6B4rW2ViASH9pg4ZlPmBbkK+3ZHOvGlUGRPQ== X-Received: by 10.28.5.8 with SMTP id 8mr1699112wmf.70.1489827376322; Sat, 18 Mar 2017 01:56:16 -0700 (PDT) Received: from localhost.localdomain (p4FF02CC6.dip0.t-ipconnect.de. [79.240.44.198]) by smtp.googlemail.com with ESMTPSA id p12sm12879637wrb.46.2017.03.18.01.56.13 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Sat, 18 Mar 2017 01:56:15 -0700 (PDT) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Sat, 18 Mar 2017 09:55:59 +0100 Message-Id: <20170318085606.26011-3-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.11.0 In-Reply-To: <20170318085606.26011-1-nfxjfg@googlemail.com> References: <20170318085606.26011-1-nfxjfg@googlemail.com> Subject: [FFmpeg-devel] [PATCH 2/9] pthread_frame: use atomics for frame progress 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: wm4 MIME-Version: 1.0 Errors-To: ffmpeg-devel-bounces@ffmpeg.org Sender: "ffmpeg-devel" From: Anton Khirnov Merges Libav commit 59c70227. Signed-off-by: wm4 --- libavcodec/pthread_frame.c | 27 +++++++++++++++++---------- 1 file changed, 17 insertions(+), 10 deletions(-) diff --git a/libavcodec/pthread_frame.c b/libavcodec/pthread_frame.c index bd250002a3..2a5dfc6723 100644 --- a/libavcodec/pthread_frame.c +++ b/libavcodec/pthread_frame.c @@ -486,9 +486,11 @@ int ff_thread_decode_frame(AVCodecContext *avctx, void ff_thread_report_progress(ThreadFrame *f, int n, int field) { PerThreadContext *p; - volatile int *progress = f->progress ? (int*)f->progress->data : NULL; + atomic_int *progress = f->progress ? (atomic_int*)f->progress->data : NULL; - if (!progress || progress[field] >= n) return; + if (!progress || + atomic_load_explicit(&progress[field], memory_order_acquire) >= n) + return; p = f->owner->internal->thread_ctx; @@ -496,7 +498,9 @@ void ff_thread_report_progress(ThreadFrame *f, int n, int field) av_log(f->owner, AV_LOG_DEBUG, "%p finished %d field %d\n", progress, n, field); pthread_mutex_lock(&p->progress_mutex); - progress[field] = n; + + atomic_store(&progress[field], n); + pthread_cond_broadcast(&p->progress_cond); pthread_mutex_unlock(&p->progress_mutex); } @@ -504,9 +508,11 @@ void ff_thread_report_progress(ThreadFrame *f, int n, int field) void ff_thread_await_progress(ThreadFrame *f, int n, int field) { PerThreadContext *p; - volatile int *progress = f->progress ? (int*)f->progress->data : NULL; + atomic_int *progress = f->progress ? (atomic_int*)f->progress->data : NULL; - if (!progress || progress[field] >= n) return; + if (!progress || + atomic_load_explicit(&progress[field], memory_order_acquire) >= n) + return; p = f->owner->internal->thread_ctx; @@ -514,7 +520,7 @@ void ff_thread_await_progress(ThreadFrame *f, int n, int field) av_log(f->owner, AV_LOG_DEBUG, "thread awaiting %d field %d from %p\n", n, field, progress); pthread_mutex_lock(&p->progress_mutex); - while (progress[field] < n) + while (atomic_load_explicit(&progress[field], memory_order_relaxed) < n) pthread_cond_wait(&p->progress_cond, &p->progress_mutex); pthread_mutex_unlock(&p->progress_mutex); } @@ -789,14 +795,15 @@ static int thread_get_buffer_internal(AVCodecContext *avctx, ThreadFrame *f, int } if (avctx->internal->allocate_progress) { - int *progress; - f->progress = av_buffer_alloc(2 * sizeof(int)); + atomic_int *progress; + f->progress = av_buffer_alloc(2 * sizeof(*progress)); if (!f->progress) { return AVERROR(ENOMEM); } - progress = (int*)f->progress->data; + progress = (atomic_int*)f->progress->data; - progress[0] = progress[1] = -1; + atomic_store(&progress[0], -1); + atomic_store(&progress[1], -1); } pthread_mutex_lock(&p->parent->buffer_mutex);