diff mbox series

[FFmpeg-devel,1/6] avformat/utils: Use static mutexes instead of ff_lock_avformat()

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

Checks

Context Check Description
andriy/make_x86 success Make finished
andriy/make_fate_x86 success Make fate finished

Commit Message

Andreas Rheinhardt May 17, 2024, 3:23 p.m. UTC
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(-)

Comments

Andreas Rheinhardt May 19, 2024, 9:57 a.m. UTC | #1
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 mbox series

Patch

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)