You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
94 lines
2.5 KiB
94 lines
2.5 KiB
From 43332a4fa12ff79f284749177dc0743a495caea6 Mon Sep 17 00:00:00 2001 |
|
From: Nicolas Chauvet <kwizart@gmail.com> |
|
Date: Sat, 18 Jul 2020 15:19:31 +0200 |
|
Subject: [PATCH 1/1] Restore support for thread callbacks for older gcrypt |
|
|
|
--- |
|
include/vlc_gcrypt.h | 64 ++++++++++++++++++++++++++++++++++++++++++++ |
|
1 file changed, 64 insertions(+) |
|
|
|
diff --git a/include/vlc_gcrypt.h b/include/vlc_gcrypt.h |
|
index a04e1b1d86..4c7f1e86b0 100644 |
|
--- a/include/vlc_gcrypt.h |
|
+++ b/include/vlc_gcrypt.h |
|
@@ -25,6 +25,67 @@ |
|
|
|
#include <errno.h> |
|
|
|
+#if GCRYPT_VERSION_NUMBER < 0x010600 |
|
+#ifdef LIBVLC_USE_PTHREAD |
|
+/** |
|
+ * If possible, use gcrypt-provided thread implementation. This is so that |
|
+ * other non-VLC components (inside the process) can also use gcrypt safely. |
|
+ */ |
|
+GCRY_THREAD_OPTION_PTHREAD_IMPL; |
|
+# define gcry_threads_vlc gcry_threads_pthread |
|
+#else |
|
+ |
|
+/** |
|
+ * gcrypt thread option VLC implementation |
|
+ */ |
|
+ |
|
+static int gcry_vlc_mutex_init( void **p_sys ) |
|
+{ |
|
+ vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); |
|
+ if( p_lock == NULL) |
|
+ return ENOMEM; |
|
+ |
|
+ vlc_mutex_init( p_lock ); |
|
+ *p_sys = p_lock; |
|
+ return VLC_SUCCESS; |
|
+} |
|
+ |
|
+static int gcry_vlc_mutex_destroy( void **p_sys ) |
|
+{ |
|
+ vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys; |
|
+ vlc_mutex_destroy( p_lock ); |
|
+ free( p_lock ); |
|
+ return VLC_SUCCESS; |
|
+} |
|
+ |
|
+static int gcry_vlc_mutex_lock( void **p_sys ) |
|
+{ |
|
+ vlc_mutex_lock( (vlc_mutex_t *)*p_sys ); |
|
+ return VLC_SUCCESS; |
|
+} |
|
+ |
|
+static int gcry_vlc_mutex_unlock( void **lock ) |
|
+{ |
|
+ vlc_mutex_unlock( (vlc_mutex_t *)*lock ); |
|
+ return VLC_SUCCESS; |
|
+} |
|
+ |
|
+static const struct gcry_thread_cbs gcry_threads_vlc = |
|
+{ |
|
+ GCRY_THREAD_OPTION_USER, |
|
+ NULL, |
|
+ gcry_vlc_mutex_init, |
|
+ gcry_vlc_mutex_destroy, |
|
+ gcry_vlc_mutex_lock, |
|
+ gcry_vlc_mutex_unlock, |
|
+ NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL |
|
+}; |
|
+#endif |
|
+#endif |
|
+ |
|
+/** |
|
+ * Initializes gcrypt with proper locking. |
|
+ */ |
|
static inline void vlc_gcrypt_init (void) |
|
{ |
|
/* This would need a process-wide static mutex with all libraries linking |
|
@@ -37,6 +98,9 @@ static inline void vlc_gcrypt_init (void) |
|
vlc_global_lock (VLC_GCRYPT_MUTEX); |
|
if (!done) |
|
{ |
|
+#if GCRYPT_VERSION_NUMBER < 0x010600 |
|
+ gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); |
|
+#endif |
|
/* The suggested way for an application to make sure that global_init |
|
* has been called is by using gcry_check_version. (see global_init |
|
* comments in gcrypt sources) */ |
|
-- |
|
2.25.4 |
|
|
|
|