From patchwork Thu Dec 21 22:22:21 2017 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: wm4 X-Patchwork-Id: 6896 Delivered-To: ffmpegpatchwork@gmail.com Received: by 10.2.79.195 with SMTP id r64csp1509130jad; Thu, 21 Dec 2017 14:22:51 -0800 (PST) X-Google-Smtp-Source: ACJfBoseuOX6U110ZUvIEhcxAvzsXfcm57MMKfZwLslfxkc8UpNLYYfWvEwtxbORAtLMICJVurHx X-Received: by 10.223.159.18 with SMTP id l18mr6710240wrf.156.1513894971750; Thu, 21 Dec 2017 14:22:51 -0800 (PST) ARC-Seal: i=1; a=rsa-sha256; t=1513894971; cv=none; d=google.com; s=arc-20160816; b=VORd9WX2PtEqejyuq3bQ2/7huzE8PhwA0dkTzl4gv1HSpcZEKPcP8b90b4KC5euK86 9rA7dI+PRHwkGxPn4wNntUWyfDNxBUqkb/uQuXbLt3yA1AVUoXojLDlFTmp0mITLL3h+ +n7BPxK1iA9PFyAxGTgunNQI9cE60PiwPQDAJk2nusTSRmvVpwm1dlUYt4NUtsGHeLN6 QL7m7QVRyFfn9AX+3CPxr8Edm4joupsaqnRZegOUQgFqiypHR3W0FLd7QXTkf6OpQu47 7aplWLr45ulqDltJOoKRXhg06am687uofToDoh+aYyLv3g8noqRfUf8JetaJ9yNdbsMU cvZw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:content-transfer-encoding:mime-version:cc:reply-to :list-subscribe:list-help:list-post:list-archive:list-unsubscribe :list-id:precedence:subject:references:in-reply-to:message-id:date :to:from:dkim-signature:delivered-to:arc-authentication-results; bh=75iFalc/9OBVnGUfwlAQO6Dv2rdOg/pTQaow9E9W73Q=; b=DQQciCRRjDzxIiOrfDhBK8F7W5FYPjf33YaoZra+Rp6pYqcfL/aIurI0/btV5tWaAr MTqH/pYd2bUCB/VPK3pmXUwxX411yXROwUR7bmBBtgC80Oh2YUpFWrCpQJI3uUmVr67Y 5rcZMcgUVR3yHKKmu9Hdu6I5b2Mr9F6bISDa63T5T7+zBaGMQ3/Ldr42+VMRshdql1Nf hh7IPVDJReWN9eKTYHdN8Wtk1eELDGD8oVfSdn/3ZNogvW6C4UIoeYZsvNDXdN1YgeQb DUnMKW9wpugYn3PPuV431DMjaExMek4HHlhrr+YlKCq9wkT1SXLKp9ZthS2qyqnXsC0R BrxA== ARC-Authentication-Results: i=1; mx.google.com; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=lkZzMvsB; 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 Return-Path: Received: from ffbox0-bg.mplayerhq.hu (ffbox0-bg.ffmpeg.org. [79.124.17.100]) by mx.google.com with ESMTP id t14si5350532wmc.14.2017.12.21.14.22.51; Thu, 21 Dec 2017 14:22:51 -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; dkim=neutral (body hash did not verify) header.i=@googlemail.com header.s=20161025 header.b=lkZzMvsB; 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 B11C2680656; Fri, 22 Dec 2017 00:22:28 +0200 (EET) X-Original-To: ffmpeg-devel@ffmpeg.org Delivered-To: ffmpeg-devel@ffmpeg.org Received: from mail-wm0-f66.google.com (mail-wm0-f66.google.com [74.125.82.66]) by ffbox0-bg.mplayerhq.hu (Postfix) with ESMTPS id A5D9468042B for ; Fri, 22 Dec 2017 00:22:22 +0200 (EET) Received: by mail-wm0-f66.google.com with SMTP id y82so22039644wmg.1 for ; Thu, 21 Dec 2017 14:22:34 -0800 (PST) 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=WIx0P/AIaDY9m2sKwGi5W5dq14QlQGpg7sDTUbZFbAo=; b=lkZzMvsBvp3rmL731xLeQJyDG3oFvE7e0pedaeVBi+igFQbt+PtTTH7IiAeLqI9F8l J+1EqXua+7c6RhGZv+7N1tsGSUvZy01IW9OP5/7cDZ4XH91YxFqtxWn6t5q6oIQrMOdZ m80tQdt/JdvRtR6mbQjuW2iqgsxeLzbJuW6tg177FANXThlhweqewv6S8g4DMRMGdwZ+ AD74LHhMECNKGF5kkDDBDy36mtZAuPh9j/0tNfIyKOvv/kYymEJUWVvOUYSRq+n9+yeO v9MhRNQ/dlEPHp7yg2Dl/o+dtCAzX/jwBPXyTvKkMadY1ZaZxyAV44B5UGnOrCD5Stvd MJ/w== 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=WIx0P/AIaDY9m2sKwGi5W5dq14QlQGpg7sDTUbZFbAo=; b=T8Wf2DZXspkdsvAavb7CyjYLaKlEDh6HLvdokIRDWUmcQMPOP6cwh6drQTS90IDFTN WF+PNR4xxyJxpZ50MT8f3PowcYQNSz/pC+u5Pk/FzXuCK6GLbRFVudqtteGCM5h8/neB cC084GMYdcN/9cLLLe8f1frZOSxjnH47NyNXkUt8xlyvMgPAhwv5rI6l65igJ4DQvWrC Rg9kj36Ed0bwKasSHJZqZDTyr1xIvX59j2ZUdPFX6KMN4LKNaibtxKTE/dbweHZDKa1d 9iAxHwNt7H90XPDSm53ZaQHz8r8KInMAS6LVRY4TXZBwZPsfffvOfGBf1yt31yNyfR5Q FX6Q== X-Gm-Message-State: AKGB3mL/XgibwYCnnDp79sovgThqhAtITzjSaeZvdtatDx5yMfDG0qAe MY40G/u1J5WPxrU6loNGQieGzg== X-Received: by 10.80.201.12 with SMTP id o12mr12175120edh.90.1513894953622; Thu, 21 Dec 2017 14:22:33 -0800 (PST) Received: from debian.speedport.ip (p2003006CCD4EDC713C06725800124D49.dip0.t-ipconnect.de. [2003:6c:cd4e:dc71:3c06:7258:12:4d49]) by smtp.googlemail.com with ESMTPSA id p47sm19834538edc.30.2017.12.21.14.22.32 (version=TLS1_2 cipher=ECDHE-RSA-AES128-GCM-SHA256 bits=128/128); Thu, 21 Dec 2017 14:22:32 -0800 (PST) From: wm4 To: ffmpeg-devel@ffmpeg.org Date: Thu, 21 Dec 2017 23:22:21 +0100 Message-Id: <20171221222224.18577-2-nfxjfg@googlemail.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20171221222224.18577-1-nfxjfg@googlemail.com> References: <20171221222224.18577-1-nfxjfg@googlemail.com> Subject: [FFmpeg-devel] [PATCH 2/5] lavc: replace and deprecate the lock manager 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" Use static mutexes instead of requiring a lock manager. The behavior should be roughly the same before and after this change for API users which did not set the lock manager at all (except that a minor memory leak disappears). --- doc/APIchanges | 5 +++ libavcodec/avcodec.h | 8 +++- libavcodec/utils.c | 107 +++++---------------------------------------------- libavcodec/version.h | 5 ++- 4 files changed, 26 insertions(+), 99 deletions(-) diff --git a/doc/APIchanges b/doc/APIchanges index da444ffb7c..df1391d83a 100644 --- a/doc/APIchanges +++ b/doc/APIchanges @@ -15,6 +15,11 @@ libavutil: 2017-10-21 API changes, most recent first: +2017-xx-xx - xxxxxxx - lavc 58.9.100 - avcodec.h + Deprecate av_lockmgr_register(). You need to build FFmpeg with threading + support enabled to get basic thread-safety (which is the default build + configuration). + 2017-xx-xx - xxxxxxx - lavc 58.8.100 - avcodec.h The MediaCodec decoders now support AVCodecContext.hw_device_ctx. diff --git a/libavcodec/avcodec.h b/libavcodec/avcodec.h index ce089b7c4a..a9182a9e3d 100644 --- a/libavcodec/avcodec.h +++ b/libavcodec/avcodec.h @@ -5930,10 +5930,11 @@ attribute_deprecated AVHWAccel *av_hwaccel_next(const AVHWAccel *hwaccel); #endif - +#if FF_API_LOCKMGR /** * Lock operation used by lockmgr */ +attribute_deprecated enum AVLockOp { AV_LOCK_CREATE, ///< Create a mutex AV_LOCK_OBTAIN, ///< Lock the mutex @@ -5963,8 +5964,13 @@ enum AVLockOp { * mechanism (i.e. do not use a single static object to * implement your lock manager). If cb is set to NULL the * lockmgr will be unregistered. + * + * @deprecated This function does nothing, and always returns 0. Be sure to + * build with thread support to get basic thread safety. */ +attribute_deprecated int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)); +#endif /** * Get the type of the given codec. diff --git a/libavcodec/utils.c b/libavcodec/utils.c index 873f39f9bd..c7f8cdf08f 100644 --- a/libavcodec/utils.c +++ b/libavcodec/utils.c @@ -67,58 +67,10 @@ #include "libavutil/ffversion.h" const char av_codec_ffversion[] = "FFmpeg version " FFMPEG_VERSION; -#if HAVE_PTHREADS || HAVE_W32THREADS || HAVE_OS2THREADS -static int default_lockmgr_cb(void **arg, enum AVLockOp op) -{ - void * volatile * mutex = arg; - int err; - - switch (op) { - case AV_LOCK_CREATE: - return 0; - case AV_LOCK_OBTAIN: - if (!*mutex) { - pthread_mutex_t *tmp = av_malloc(sizeof(pthread_mutex_t)); - if (!tmp) - return AVERROR(ENOMEM); - if ((err = pthread_mutex_init(tmp, NULL))) { - av_free(tmp); - return AVERROR(err); - } - if (avpriv_atomic_ptr_cas(mutex, NULL, tmp)) { - pthread_mutex_destroy(tmp); - av_free(tmp); - } - } - - if ((err = pthread_mutex_lock(*mutex))) - return AVERROR(err); - - return 0; - case AV_LOCK_RELEASE: - if ((err = pthread_mutex_unlock(*mutex))) - return AVERROR(err); - - return 0; - case AV_LOCK_DESTROY: - if (*mutex) - pthread_mutex_destroy(*mutex); - av_free(*mutex); - avpriv_atomic_ptr_cas(mutex, *mutex, NULL); - return 0; - } - return 1; -} -static int (*lockmgr_cb)(void **mutex, enum AVLockOp op) = default_lockmgr_cb; -#else -static int (*lockmgr_cb)(void **mutex, enum AVLockOp op) = NULL; -#endif - - volatile int ff_avcodec_locked; static atomic_int entangled_thread_counter = ATOMIC_VAR_INIT(0); -static void *codec_mutex; -static void *avformat_mutex; +static pthread_mutex_t codec_mutex = PTHREAD_MUTEX_INITIALIZER; +static pthread_mutex_t avformat_mutex = PTHREAD_MUTEX_INITIALIZER; void av_fast_padded_malloc(void *ptr, unsigned int *size, size_t min_size) { @@ -1909,55 +1861,26 @@ void av_register_hwaccel(AVHWAccel *hwaccel) } #endif +#if FF_API_LOCKMGR int av_lockmgr_register(int (*cb)(void **mutex, enum AVLockOp op)) { - if (lockmgr_cb) { - // There is no good way to rollback a failure to destroy the - // mutex, so we ignore failures. - lockmgr_cb(&codec_mutex, AV_LOCK_DESTROY); - lockmgr_cb(&avformat_mutex, AV_LOCK_DESTROY); - lockmgr_cb = NULL; - codec_mutex = NULL; - avformat_mutex = NULL; - } - - if (cb) { - void *new_codec_mutex = NULL; - void *new_avformat_mutex = NULL; - int err; - if (err = cb(&new_codec_mutex, AV_LOCK_CREATE)) { - return err > 0 ? AVERROR_UNKNOWN : err; - } - if (err = cb(&new_avformat_mutex, AV_LOCK_CREATE)) { - // Ignore failures to destroy the newly created mutex. - cb(&new_codec_mutex, AV_LOCK_DESTROY); - return err > 0 ? AVERROR_UNKNOWN : err; - } - lockmgr_cb = cb; - codec_mutex = new_codec_mutex; - avformat_mutex = new_avformat_mutex; - } - return 0; } +#endif int ff_lock_avcodec(AVCodecContext *log_ctx, const AVCodec *codec) { if (codec->caps_internal & FF_CODEC_CAP_INIT_THREADSAFE || !codec->init) return 0; - if (lockmgr_cb) { - if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_OBTAIN)) - return -1; - } + if (pthread_mutex_lock(&codec_mutex)) + return -1; if (atomic_fetch_add(&entangled_thread_counter, 1)) { av_log(log_ctx, AV_LOG_ERROR, "Insufficient thread locking. At least %d threads are " "calling avcodec_open2() at the same time right now.\n", atomic_load(&entangled_thread_counter)); - if (!lockmgr_cb) - av_log(log_ctx, AV_LOG_ERROR, "No lock manager is set, please see av_lockmgr_register()\n"); ff_avcodec_locked = 1; ff_unlock_avcodec(codec); return AVERROR(EINVAL); @@ -1975,30 +1898,20 @@ int ff_unlock_avcodec(const AVCodec *codec) av_assert0(ff_avcodec_locked); ff_avcodec_locked = 0; atomic_fetch_add(&entangled_thread_counter, -1); - if (lockmgr_cb) { - if ((*lockmgr_cb)(&codec_mutex, AV_LOCK_RELEASE)) - return -1; - } + if (pthread_mutex_unlock(&codec_mutex)) + return -1; return 0; } int avpriv_lock_avformat(void) { - if (lockmgr_cb) { - if ((*lockmgr_cb)(&avformat_mutex, AV_LOCK_OBTAIN)) - return -1; - } - return 0; + return pthread_mutex_lock(&avformat_mutex) ? -1 : 0; } int avpriv_unlock_avformat(void) { - if (lockmgr_cb) { - if ((*lockmgr_cb)(&avformat_mutex, AV_LOCK_RELEASE)) - return -1; - } - return 0; + return pthread_mutex_unlock(&avformat_mutex) ? -1 : 0; } unsigned int avpriv_toupper4(unsigned int x) diff --git a/libavcodec/version.h b/libavcodec/version.h index d55de89797..47a15d52b8 100644 --- a/libavcodec/version.h +++ b/libavcodec/version.h @@ -28,7 +28,7 @@ #include "libavutil/version.h" #define LIBAVCODEC_VERSION_MAJOR 58 -#define LIBAVCODEC_VERSION_MINOR 8 +#define LIBAVCODEC_VERSION_MINOR 9 #define LIBAVCODEC_VERSION_MICRO 100 #define LIBAVCODEC_VERSION_INT AV_VERSION_INT(LIBAVCODEC_VERSION_MAJOR, \ @@ -126,6 +126,9 @@ #ifndef FF_API_USER_VISIBLE_AVHWACCEL #define FF_API_USER_VISIBLE_AVHWACCEL (LIBAVCODEC_VERSION_MAJOR < 59) #endif +#ifndef FF_API_LOCKMGR +#define FF_API_LOCKMGR (LIBAVCODEC_VERSION_MAJOR < 59) +#endif #endif /* AVCODEC_VERSION_H */