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.
95 lines
2.5 KiB
95 lines
2.5 KiB
1 year ago
|
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
|
||
|
|