From patchwork Tue Apr 4 13:09:36 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: 3284 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.103.44.195 with SMTP id s186csp181677vss; Tue, 4 Apr 2017 06:09:51 -0700 (PDT) X-Received: by 10.223.166.46 with SMTP id k43mr21090929wrc.64.1491311390986; Tue, 04 Apr 2017 06:09:50 -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 d43si24432062wrd.163.2017.04.04.06.09.50; Tue, 04 Apr 2017 06:09:50 -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 83DC0688295; Tue, 4 Apr 2017 16:09:45 +0300 (EEST) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-qk0-f179.google.com (mail-qk0-f179.google.com [209.85.220.179]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id 2D62B680D07 for ; Tue, 4 Apr 2017 16:09:39 +0300 (EEST) Received: by mail-qk0-f179.google.com with SMTP id h67so41761962qke.0 for ; Tue, 04 Apr 2017 06:09:41 -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; bh=ztxLGPL/m/YYW6jRvy/QspRM6sxzTJniWurc91x8FZo=; b=uJp8d2GRRiDCG+5b1CxlH3t42ARULoTOx6ABkqSNt/6JEeU2dlXWLIqEn4SntOWrsW 6Nf5y9d21vEcQ2ZgyGChxMCOfbnpgRjukcniQPgmqf9ON3fz4QHAgwIFqYstfy14GFxT 03x93/hzqbM7sRSOq4AEHnVbBKuxxq432sQKTbbT/T5hzP1/1mwadvuBn5Uj1wicXK+p J1njfqA0Pn9PTOg/yrD55Dbj2gl1kvbnoeqzyFXRsjXbDZ6XX6Vj+RtAvLVJQriuQK65 2nN71pubsEOm0Yj/Got2IaktgkJ+n/E2vyN3JoGZYlAaOlYKmyhdCJlNhlovZJ0kmPaW QOtQ== 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; bh=ztxLGPL/m/YYW6jRvy/QspRM6sxzTJniWurc91x8FZo=; b=cwn7v5MepgqXLRrX7ZkyKgqEbNE6EFVtq/iAawpyGXNF1MWwnRad4ijJJS/fLA2r7b inbQQIAygeMZGWRqjS4xH7fLzMZEB/9ou/qVGhDNiXFA8jVDAN9BM/puS2Z81NnoWqho rC/b+za4LlGw6bbKtTZXU+pQngyLSe0E8cOHUvmLftNThIB1BYfKL2Ije4sgm7FOFh6W W+dW/Ci96wm5w36Izs+7hzMTaOlOmlu/82Wxfb/IgXjOnstYEN7Se6fBO4Yww8e1ALqL f59vkxBZakwpcXa3pSaa6G7ohiLNN1KaVNAXOHVXe2wToRUdgzgruKny9F10/Vj7xfG+ PL+A== X-Gm-Message-State: AFeK/H0Qxu306TRo2kttzgvyLOBnlwlKGjhkp3Bz+z1pWDk8qKVwDNZzh7maBGWRQ2ySwQ== X-Received: by 10.55.119.65 with SMTP id s62mr21231391qkc.130.1491311379973; Tue, 04 Apr 2017 06:09:39 -0700 (PDT) Received: from localhost.localdomain ([65.206.95.146]) by smtp.gmail.com with ESMTPSA id t71sm124014qki.8.2017.04.04.06.09.38 (version=TLS1 cipher=AES128-SHA bits=128/128); Tue, 04 Apr 2017 06:09:38 -0700 (PDT) From: "Ronald S. Bultje" To: ffmpeg-devel@ffmpeg.org Date: Tue, 4 Apr 2017 09:09:36 -0400 Message-Id: <1491311376-4130-1-git-send-email-rsbultje@gmail.com> X-Mailer: git-send-email 2.8.1 Subject: [FFmpeg-devel] [PATCH] idctdsp: make ff_add/put_pixels_clamped function pointers atomic. 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" This fixes the following tsan warnings when running fate-dnxhr-parse: WARNING: ThreadSanitizer: data race (pid=29917) Write of size 8 at 0x0000025b12d8 by thread T2 (mutexes: write M1543): #0 ff_idctdsp_init src/libavcodec/idctdsp.c:313 (ffmpeg+0x00000044b68e) [..] Previous write of size 8 at 0x0000025b12d8 by thread T1 (mutexes: write M1541): #0 ff_idctdsp_init src/libavcodec/idctdsp.c:313 (ffmpeg+0x00000044b68e) --- libavcodec/idctdsp.c | 8 ++++---- libavcodec/idctdsp.h | 17 +++++++++++++++-- 2 files changed, 19 insertions(+), 6 deletions(-) diff --git a/libavcodec/idctdsp.c b/libavcodec/idctdsp.c index 84dd645..9bcf8ae 100644 --- a/libavcodec/idctdsp.c +++ b/libavcodec/idctdsp.c @@ -80,8 +80,8 @@ av_cold void ff_init_scantable_permutation(uint8_t *idct_permutation, } } -void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); -void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); +atomic_uintptr_t ff_put_pixels_clamped_fn_ptr; +atomic_uintptr_t ff_add_pixels_clamped_fn_ptr; static void put_pixels_clamped_c(const int16_t *block, uint8_t *av_restrict pixels, ptrdiff_t line_size) @@ -310,8 +310,8 @@ av_cold void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx) if (ARCH_MIPS) ff_idctdsp_init_mips(c, avctx, high_bit_depth); - ff_put_pixels_clamped = c->put_pixels_clamped; - ff_add_pixels_clamped = c->add_pixels_clamped; + atomic_store(&ff_put_pixels_clamped_fn_ptr, (uintptr_t) c->put_pixels_clamped); + atomic_store(&ff_add_pixels_clamped_fn_ptr, (uintptr_t) c->add_pixels_clamped); ff_init_scantable_permutation(c->idct_permutation, c->perm_type); diff --git a/libavcodec/idctdsp.h b/libavcodec/idctdsp.h index f9ba6c3..16595fc 100644 --- a/libavcodec/idctdsp.h +++ b/libavcodec/idctdsp.h @@ -19,6 +19,7 @@ #ifndef AVCODEC_IDCTDSP_H #define AVCODEC_IDCTDSP_H +#include #include #include "config.h" @@ -97,8 +98,20 @@ typedef struct IDCTDSPContext { enum idct_permutation_type perm_type; } IDCTDSPContext; -extern void (*ff_put_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); -extern void (*ff_add_pixels_clamped)(const int16_t *block, uint8_t *pixels, ptrdiff_t line_size); +typedef void (*px_clamp_fn)(const int16_t *block, uint8_t *pixels, + ptrdiff_t line_size); + +#define ff_put_pixels_clamped ff_put_pixels_clamped_get_fn_ptr() +extern atomic_uintptr_t ff_put_pixels_clamped_fn_ptr; +static av_always_inline px_clamp_fn ff_put_pixels_clamped_get_fn_ptr(void) { + return (px_clamp_fn) atomic_load(&ff_put_pixels_clamped_fn_ptr); +} + +#define ff_add_pixels_clamped ff_add_pixels_clamped_get_fn_ptr() +extern atomic_uintptr_t ff_add_pixels_clamped_fn_ptr; +static av_always_inline px_clamp_fn ff_add_pixels_clamped_get_fn_ptr(void) { + return (px_clamp_fn) atomic_load(&ff_add_pixels_clamped_fn_ptr); +} void ff_idctdsp_init(IDCTDSPContext *c, AVCodecContext *avctx);