From e2133869a6dd73b22775d826729b6033131d98f3 Mon Sep 17 00:00:00 2001 From: =?utf8?q?R=C3=A9mi=20Denis-Courmont?= Date: Sun, 4 May 2008 14:33:19 +0300 Subject: [PATCH] Factorize the gcrypt thread support --- include/vlc_gcrypt.h | 89 +++++++++++++++++++++++++++++++++++++++++++ modules/misc/gnutls.c | 66 +++----------------------------- src/Makefile.am | 1 + 3 files changed, 95 insertions(+), 61 deletions(-) create mode 100644 include/vlc_gcrypt.h diff --git a/include/vlc_gcrypt.h b/include/vlc_gcrypt.h new file mode 100644 index 0000000000..8a654607c5 --- /dev/null +++ b/include/vlc_gcrypt.h @@ -0,0 +1,89 @@ +/***************************************************************************** + * vlc_gcrypt.h: VLC thread support for gcrypt + ***************************************************************************** + * Copyright (C) 2004-2008 Rémi Denis-Courmont + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 2 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program; if not, write to the Free Software + * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA. + *****************************************************************************/ + +#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 ) +{ + int i_val; + vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); + + if( p_lock == NULL) + return ENOMEM; + + i_val = vlc_mutex_init( p_lock ); + if( i_val ) + free( p_lock ); + else + *p_sys = p_lock; + return i_val; +} + +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 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 +}; +#endif + +/** + * Initializes gcrypt with proper locking. + * @return VLC_SUCCESS on success, a VLC error code otherwise. + */ +static inline void vlc_gcrypt_init (void) +{ + vlc_mutex_t *lock = var_AcquireMutex ("gcrypt_mutex"); + gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); + vlc_mutex_unlock (lock); +} diff --git a/modules/misc/gnutls.c b/modules/misc/gnutls.c index c75ae56935..88fcc32700 100644 --- a/modules/misc/gnutls.c +++ b/modules/misc/gnutls.c @@ -46,13 +46,15 @@ #endif -#include "vlc_tls.h" +#include #include #include #include #include +#include + #define CACHE_TIMEOUT 3600 #define CACHE_SIZE 64 @@ -101,64 +103,6 @@ vlc_module_begin(); CACHE_SIZE_LONGTEXT, true ); vlc_module_end(); - - -#ifdef LIBVLC_USE_PTHREAD -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 ) -{ - int i_val; - vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) ); - - if( p_lock == NULL) - return ENOMEM; - - i_val = vlc_mutex_init( p_lock ); - if( i_val ) - free( p_lock ); - else - *p_sys = p_lock; - return i_val; -} - -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 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 -}; -#endif - - /** * Initializes GnuTLS with proper locking. * @return VLC_SUCCESS on success, a VLC error code otherwise. @@ -167,9 +111,9 @@ static int gnutls_Init (vlc_object_t *p_this) { int ret = VLC_EGENERIC; - vlc_mutex_t *lock = var_AcquireMutex ("gnutls_mutex"); + vlc_gcrypt_init (); /* GnuTLS depends on gcrypt */ - gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc); + vlc_mutex_t *lock = var_AcquireMutex ("gnutls_mutex"); if (gnutls_global_init ()) { msg_Err (p_this, "cannot initialize GnuTLS"); diff --git a/src/Makefile.am b/src/Makefile.am index c866633e26..5c548227e1 100644 --- a/src/Makefile.am +++ b/src/Makefile.am @@ -73,6 +73,7 @@ noinst_HEADERS = \ ../include/vlc_events.h \ ../include/vlc_filter.h \ ../include/vlc_fixups.h \ + ../include/vlc_gcrypt.h \ ../include/vlc_httpd.h \ ../include/vlc_image.h \ ../include/vlc_input.h \ -- 2.39.5