Message ID | AS8P250MB0744CC67273864DA864725B98FEE2@AS8P250MB0744.EURP250.PROD.OUTLOOK.COM |
---|---|
State | Accepted |
Commit | 8b48b0adab0d9ad7655eb7746253061edeea58ae |
Headers | show |
Series | [FFmpeg-devel,1/6] avformat/utils: Use static mutexes instead of ff_lock_avformat() | expand |
Context | Check | Description |
---|---|---|
andriy/make_x86 | success | Make finished |
andriy/make_fate_x86 | success | Make fate finished |
Andreas Rheinhardt: > Its existence is a remnant of (libavcodec's) lock-manager API > which has been removed in a04c2c707de2ce850f79870e84ac9d7ec7aa9143. > There is no need to use the same lock for avisynth, chromaprint > or tls, so switch to ordinary static mutexes instead. > > Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> > --- > libavformat/avisynth.c | 15 +++++++++------ > libavformat/chromaprint.c | 12 +++++++----- > libavformat/internal.h | 3 --- > libavformat/tls_gnutls.c | 16 +++++++--------- > libavformat/tls_openssl.c | 17 +++++++---------- > libavformat/utils.c | 13 ------------- > 6 files changed, 30 insertions(+), 46 deletions(-) > > diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c > index 1709bf4051..625bdf7e3a 100644 > --- a/libavformat/avisynth.c > +++ b/libavformat/avisynth.c > @@ -23,6 +23,7 @@ > #include "libavutil/internal.h" > #include "libavutil/mem.h" > #include "libavutil/opt.h" > +#include "libavutil/thread.h" > > #include "avformat.h" > #include "demux.h" > @@ -130,6 +131,8 @@ static const int avs_planes_yuva[4] = { AVS_PLANAR_Y, AVS_PLANAR_U, > static const int avs_planes_rgba[4] = { AVS_PLANAR_G, AVS_PLANAR_B, > AVS_PLANAR_R, AVS_PLANAR_A }; > > +static AVMutex avisynth_mutex = AV_MUTEX_INITIALIZER; > + > /* A conflict between C++ global objects, atexit, and dynamic loading requires > * us to register our own atexit handler to prevent double freeing. */ > static AviSynthLibrary avs_library; > @@ -1083,15 +1086,15 @@ static av_cold int avisynth_read_header(AVFormatContext *s) > int ret; > > // Calling library must implement a lock for thread-safe opens. > - if (ret = ff_lock_avformat()) > - return ret; > + if (ff_mutex_lock(&avisynth_mutex)) > + return AVERROR_UNKNOWN; > > if (ret = avisynth_open_file(s)) { > - ff_unlock_avformat(); > + ff_mutex_unlock(&avisynth_mutex); > return ret; > } > > - ff_unlock_avformat(); > + ff_mutex_unlock(&avisynth_mutex); > return 0; > } > > @@ -1127,11 +1130,11 @@ static int avisynth_read_packet(AVFormatContext *s, AVPacket *pkt) > > static av_cold int avisynth_read_close(AVFormatContext *s) > { > - if (ff_lock_avformat()) > + if (ff_mutex_lock(&avisynth_mutex)) > return AVERROR_UNKNOWN; > > avisynth_context_destroy(s->priv_data); > - ff_unlock_avformat(); > + ff_mutex_unlock(&avisynth_mutex); > return 0; > } > > diff --git a/libavformat/chromaprint.c b/libavformat/chromaprint.c > index 1cdca47ea5..eae233a651 100644 > --- a/libavformat/chromaprint.c > +++ b/libavformat/chromaprint.c > @@ -20,15 +20,17 @@ > */ > > #include "avformat.h" > -#include "internal.h" > #include "mux.h" > #include "libavutil/opt.h" > +#include "libavutil/thread.h" > #include <chromaprint.h> > > #define CPR_VERSION_INT AV_VERSION_INT(CHROMAPRINT_VERSION_MAJOR, \ > CHROMAPRINT_VERSION_MINOR, \ > CHROMAPRINT_VERSION_PATCH) > > +static AVMutex chromaprint_mutex = AV_MUTEX_INITIALIZER; > + > typedef enum FingerprintFormat { > FINGERPRINT_RAW, > FINGERPRINT_COMPRESSED, > @@ -52,9 +54,9 @@ static void deinit(AVFormatContext *s) > ChromaprintMuxContext *const cpr = s->priv_data; > > if (cpr->ctx) { > - ff_lock_avformat(); > + ff_mutex_lock(&chromaprint_mutex); > chromaprint_free(cpr->ctx); > - ff_unlock_avformat(); > + ff_mutex_unlock(&chromaprint_mutex); > } > } > > @@ -63,9 +65,9 @@ static av_cold int init(AVFormatContext *s) > ChromaprintMuxContext *cpr = s->priv_data; > AVStream *st; > > - ff_lock_avformat(); > + ff_mutex_lock(&chromaprint_mutex); > cpr->ctx = chromaprint_new(cpr->algorithm); > - ff_unlock_avformat(); > + ff_mutex_unlock(&chromaprint_mutex); > > if (!cpr->ctx) { > av_log(s, AV_LOG_ERROR, "Failed to create chromaprint context.\n"); > diff --git a/libavformat/internal.h b/libavformat/internal.h > index 7f3d1c0086..6bad4fd119 100644 > --- a/libavformat/internal.h > +++ b/libavformat/internal.h > @@ -727,9 +727,6 @@ struct AVBPrint; > */ > int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf); > > -int ff_lock_avformat(void); > -int ff_unlock_avformat(void); > - > /** > * Set AVFormatContext url field to the provided pointer. The pointer must > * point to a valid string. The existing url field is freed if necessary. Also > diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c > index 2ab38a199b..df251ad79c 100644 > --- a/libavformat/tls_gnutls.c > +++ b/libavformat/tls_gnutls.c > @@ -25,15 +25,12 @@ > #include <gnutls/x509.h> > > #include "avformat.h" > -#include "internal.h" > #include "network.h" > #include "os_support.h" > #include "url.h" > #include "tls.h" > -#include "libavcodec/internal.h" > -#include "libavutil/avstring.h" > #include "libavutil/opt.h" > -#include "libavutil/parseutils.h" > +#include "libavutil/thread.h" > > #ifndef GNUTLS_VERSION_NUMBER > #define GNUTLS_VERSION_NUMBER LIBGNUTLS_VERSION_NUMBER > @@ -41,7 +38,6 @@ > > #if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00 > #include <gcrypt.h> > -#include "libavutil/thread.h" > GCRY_THREAD_OPTION_PTHREAD_IMPL; > #endif > > @@ -54,22 +50,24 @@ typedef struct TLSContext { > int io_err; > } TLSContext; > > +static AVMutex gnutls_mutex = AV_MUTEX_INITIALIZER; > + > void ff_gnutls_init(void) > { > - ff_lock_avformat(); > + ff_mutex_lock(&gnutls_mutex); > #if HAVE_THREADS && GNUTLS_VERSION_NUMBER < 0x020b00 > if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0) > gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); > #endif > gnutls_global_init(); > - ff_unlock_avformat(); > + ff_mutex_unlock(&gnutls_mutex); > } > > void ff_gnutls_deinit(void) > { > - ff_lock_avformat(); > + ff_mutex_lock(&gnutls_mutex); > gnutls_global_deinit(); > - ff_unlock_avformat(); > + ff_mutex_unlock(&gnutls_mutex); > } > > static int print_tls_error(URLContext *h, int ret) > diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c > index b875be32f0..89d7c6e1ea 100644 > --- a/libavformat/tls_openssl.c > +++ b/libavformat/tls_openssl.c > @@ -19,17 +19,12 @@ > * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA > */ > > -#include "avformat.h" > -#include "internal.h" > #include "network.h" > #include "os_support.h" > #include "url.h" > #include "tls.h" > -#include "libavutil/avstring.h" > -#include "libavutil/avutil.h" > #include "libavutil/mem.h" > #include "libavutil/opt.h" > -#include "libavutil/parseutils.h" > #include "libavutil/thread.h" > > #include <openssl/bio.h> > @@ -49,6 +44,8 @@ typedef struct TLSContext { > int io_err; > } TLSContext; > > +static AVMutex openssl_mutex = AV_MUTEX_INITIALIZER; > + > #if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L > #include <openssl/crypto.h> > pthread_mutex_t *openssl_mutexes; > @@ -69,7 +66,7 @@ static unsigned long openssl_thread_id(void) > > int ff_openssl_init(void) > { > - ff_lock_avformat(); > + ff_mutex_lock(&openssl_mutex); > if (!openssl_init) { > /* OpenSSL 1.0.2 or below, then you would use SSL_library_init. If you are > * using OpenSSL 1.1.0 or above, then the library will initialize > @@ -85,7 +82,7 @@ int ff_openssl_init(void) > int i; > openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks()); > if (!openssl_mutexes) { > - ff_unlock_avformat(); > + ff_mutex_unlock(&openssl_mutex); > return AVERROR(ENOMEM); > } > > @@ -99,14 +96,14 @@ int ff_openssl_init(void) > #endif > } > openssl_init++; > - ff_unlock_avformat(); > + ff_mutex_unlock(&openssl_mutex); > > return 0; > } > > void ff_openssl_deinit(void) > { > - ff_lock_avformat(); > + ff_mutex_lock(&openssl_mutex); > openssl_init--; > if (!openssl_init) { > #if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L > @@ -119,7 +116,7 @@ void ff_openssl_deinit(void) > } > #endif > } > - ff_unlock_avformat(); > + ff_mutex_unlock(&openssl_mutex); > } > > static int print_tls_error(URLContext *h, int ret) > diff --git a/libavformat/utils.c b/libavformat/utils.c > index 4dded7aea4..e9ded627ad 100644 > --- a/libavformat/utils.c > +++ b/libavformat/utils.c > @@ -27,7 +27,6 @@ > #include "libavutil/bprint.h" > #include "libavutil/internal.h" > #include "libavutil/mem.h" > -#include "libavutil/thread.h" > #include "libavutil/time.h" > > #include "libavcodec/internal.h" > @@ -40,23 +39,11 @@ > #endif > #include "os_support.h" > > -static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER; > - > /** > * @file > * various utility functions for use within FFmpeg > */ > > -int ff_lock_avformat(void) > -{ > - return ff_mutex_lock(&avformat_mutex) ? -1 : 0; > -} > - > -int ff_unlock_avformat(void) > -{ > - return ff_mutex_unlock(&avformat_mutex) ? -1 : 0; > -} > - > /* an arbitrarily chosen "sane" max packet size -- 50M */ > #define SANE_CHUNK_SIZE (50000000) > Will apply this patchset tomorrow unless there are objections. - Andreas
diff --git a/libavformat/avisynth.c b/libavformat/avisynth.c index 1709bf4051..625bdf7e3a 100644 --- a/libavformat/avisynth.c +++ b/libavformat/avisynth.c @@ -23,6 +23,7 @@ #include "libavutil/internal.h" #include "libavutil/mem.h" #include "libavutil/opt.h" +#include "libavutil/thread.h" #include "avformat.h" #include "demux.h" @@ -130,6 +131,8 @@ static const int avs_planes_yuva[4] = { AVS_PLANAR_Y, AVS_PLANAR_U, static const int avs_planes_rgba[4] = { AVS_PLANAR_G, AVS_PLANAR_B, AVS_PLANAR_R, AVS_PLANAR_A }; +static AVMutex avisynth_mutex = AV_MUTEX_INITIALIZER; + /* A conflict between C++ global objects, atexit, and dynamic loading requires * us to register our own atexit handler to prevent double freeing. */ static AviSynthLibrary avs_library; @@ -1083,15 +1086,15 @@ static av_cold int avisynth_read_header(AVFormatContext *s) int ret; // Calling library must implement a lock for thread-safe opens. - if (ret = ff_lock_avformat()) - return ret; + if (ff_mutex_lock(&avisynth_mutex)) + return AVERROR_UNKNOWN; if (ret = avisynth_open_file(s)) { - ff_unlock_avformat(); + ff_mutex_unlock(&avisynth_mutex); return ret; } - ff_unlock_avformat(); + ff_mutex_unlock(&avisynth_mutex); return 0; } @@ -1127,11 +1130,11 @@ static int avisynth_read_packet(AVFormatContext *s, AVPacket *pkt) static av_cold int avisynth_read_close(AVFormatContext *s) { - if (ff_lock_avformat()) + if (ff_mutex_lock(&avisynth_mutex)) return AVERROR_UNKNOWN; avisynth_context_destroy(s->priv_data); - ff_unlock_avformat(); + ff_mutex_unlock(&avisynth_mutex); return 0; } diff --git a/libavformat/chromaprint.c b/libavformat/chromaprint.c index 1cdca47ea5..eae233a651 100644 --- a/libavformat/chromaprint.c +++ b/libavformat/chromaprint.c @@ -20,15 +20,17 @@ */ #include "avformat.h" -#include "internal.h" #include "mux.h" #include "libavutil/opt.h" +#include "libavutil/thread.h" #include <chromaprint.h> #define CPR_VERSION_INT AV_VERSION_INT(CHROMAPRINT_VERSION_MAJOR, \ CHROMAPRINT_VERSION_MINOR, \ CHROMAPRINT_VERSION_PATCH) +static AVMutex chromaprint_mutex = AV_MUTEX_INITIALIZER; + typedef enum FingerprintFormat { FINGERPRINT_RAW, FINGERPRINT_COMPRESSED, @@ -52,9 +54,9 @@ static void deinit(AVFormatContext *s) ChromaprintMuxContext *const cpr = s->priv_data; if (cpr->ctx) { - ff_lock_avformat(); + ff_mutex_lock(&chromaprint_mutex); chromaprint_free(cpr->ctx); - ff_unlock_avformat(); + ff_mutex_unlock(&chromaprint_mutex); } } @@ -63,9 +65,9 @@ static av_cold int init(AVFormatContext *s) ChromaprintMuxContext *cpr = s->priv_data; AVStream *st; - ff_lock_avformat(); + ff_mutex_lock(&chromaprint_mutex); cpr->ctx = chromaprint_new(cpr->algorithm); - ff_unlock_avformat(); + ff_mutex_unlock(&chromaprint_mutex); if (!cpr->ctx) { av_log(s, AV_LOG_ERROR, "Failed to create chromaprint context.\n"); diff --git a/libavformat/internal.h b/libavformat/internal.h index 7f3d1c0086..6bad4fd119 100644 --- a/libavformat/internal.h +++ b/libavformat/internal.h @@ -727,9 +727,6 @@ struct AVBPrint; */ int ff_bprint_to_codecpar_extradata(AVCodecParameters *par, struct AVBPrint *buf); -int ff_lock_avformat(void); -int ff_unlock_avformat(void); - /** * Set AVFormatContext url field to the provided pointer. The pointer must * point to a valid string. The existing url field is freed if necessary. Also diff --git a/libavformat/tls_gnutls.c b/libavformat/tls_gnutls.c index 2ab38a199b..df251ad79c 100644 --- a/libavformat/tls_gnutls.c +++ b/libavformat/tls_gnutls.c @@ -25,15 +25,12 @@ #include <gnutls/x509.h> #include "avformat.h" -#include "internal.h" #include "network.h" #include "os_support.h" #include "url.h" #include "tls.h" -#include "libavcodec/internal.h" -#include "libavutil/avstring.h" #include "libavutil/opt.h" -#include "libavutil/parseutils.h" +#include "libavutil/thread.h" #ifndef GNUTLS_VERSION_NUMBER #define GNUTLS_VERSION_NUMBER LIBGNUTLS_VERSION_NUMBER @@ -41,7 +38,6 @@ #if HAVE_THREADS && GNUTLS_VERSION_NUMBER <= 0x020b00 #include <gcrypt.h> -#include "libavutil/thread.h" GCRY_THREAD_OPTION_PTHREAD_IMPL; #endif @@ -54,22 +50,24 @@ typedef struct TLSContext { int io_err; } TLSContext; +static AVMutex gnutls_mutex = AV_MUTEX_INITIALIZER; + void ff_gnutls_init(void) { - ff_lock_avformat(); + ff_mutex_lock(&gnutls_mutex); #if HAVE_THREADS && GNUTLS_VERSION_NUMBER < 0x020b00 if (gcry_control(GCRYCTL_ANY_INITIALIZATION_P) == 0) gcry_control(GCRYCTL_SET_THREAD_CBS, &gcry_threads_pthread); #endif gnutls_global_init(); - ff_unlock_avformat(); + ff_mutex_unlock(&gnutls_mutex); } void ff_gnutls_deinit(void) { - ff_lock_avformat(); + ff_mutex_lock(&gnutls_mutex); gnutls_global_deinit(); - ff_unlock_avformat(); + ff_mutex_unlock(&gnutls_mutex); } static int print_tls_error(URLContext *h, int ret) diff --git a/libavformat/tls_openssl.c b/libavformat/tls_openssl.c index b875be32f0..89d7c6e1ea 100644 --- a/libavformat/tls_openssl.c +++ b/libavformat/tls_openssl.c @@ -19,17 +19,12 @@ * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA */ -#include "avformat.h" -#include "internal.h" #include "network.h" #include "os_support.h" #include "url.h" #include "tls.h" -#include "libavutil/avstring.h" -#include "libavutil/avutil.h" #include "libavutil/mem.h" #include "libavutil/opt.h" -#include "libavutil/parseutils.h" #include "libavutil/thread.h" #include <openssl/bio.h> @@ -49,6 +44,8 @@ typedef struct TLSContext { int io_err; } TLSContext; +static AVMutex openssl_mutex = AV_MUTEX_INITIALIZER; + #if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L #include <openssl/crypto.h> pthread_mutex_t *openssl_mutexes; @@ -69,7 +66,7 @@ static unsigned long openssl_thread_id(void) int ff_openssl_init(void) { - ff_lock_avformat(); + ff_mutex_lock(&openssl_mutex); if (!openssl_init) { /* OpenSSL 1.0.2 or below, then you would use SSL_library_init. If you are * using OpenSSL 1.1.0 or above, then the library will initialize @@ -85,7 +82,7 @@ int ff_openssl_init(void) int i; openssl_mutexes = av_malloc_array(sizeof(pthread_mutex_t), CRYPTO_num_locks()); if (!openssl_mutexes) { - ff_unlock_avformat(); + ff_mutex_unlock(&openssl_mutex); return AVERROR(ENOMEM); } @@ -99,14 +96,14 @@ int ff_openssl_init(void) #endif } openssl_init++; - ff_unlock_avformat(); + ff_mutex_unlock(&openssl_mutex); return 0; } void ff_openssl_deinit(void) { - ff_lock_avformat(); + ff_mutex_lock(&openssl_mutex); openssl_init--; if (!openssl_init) { #if HAVE_THREADS && OPENSSL_VERSION_NUMBER < 0x10100000L @@ -119,7 +116,7 @@ void ff_openssl_deinit(void) } #endif } - ff_unlock_avformat(); + ff_mutex_unlock(&openssl_mutex); } static int print_tls_error(URLContext *h, int ret) diff --git a/libavformat/utils.c b/libavformat/utils.c index 4dded7aea4..e9ded627ad 100644 --- a/libavformat/utils.c +++ b/libavformat/utils.c @@ -27,7 +27,6 @@ #include "libavutil/bprint.h" #include "libavutil/internal.h" #include "libavutil/mem.h" -#include "libavutil/thread.h" #include "libavutil/time.h" #include "libavcodec/internal.h" @@ -40,23 +39,11 @@ #endif #include "os_support.h" -static AVMutex avformat_mutex = AV_MUTEX_INITIALIZER; - /** * @file * various utility functions for use within FFmpeg */ -int ff_lock_avformat(void) -{ - return ff_mutex_lock(&avformat_mutex) ? -1 : 0; -} - -int ff_unlock_avformat(void) -{ - return ff_mutex_unlock(&avformat_mutex) ? -1 : 0; -} - /* an arbitrarily chosen "sane" max packet size -- 50M */ #define SANE_CHUNK_SIZE (50000000)
Its existence is a remnant of (libavcodec's) lock-manager API which has been removed in a04c2c707de2ce850f79870e84ac9d7ec7aa9143. There is no need to use the same lock for avisynth, chromaprint or tls, so switch to ordinary static mutexes instead. Signed-off-by: Andreas Rheinhardt <andreas.rheinhardt@outlook.com> --- libavformat/avisynth.c | 15 +++++++++------ libavformat/chromaprint.c | 12 +++++++----- libavformat/internal.h | 3 --- libavformat/tls_gnutls.c | 16 +++++++--------- libavformat/tls_openssl.c | 17 +++++++---------- libavformat/utils.c | 13 ------------- 6 files changed, 30 insertions(+), 46 deletions(-)