Commit e2133869 authored by Rémi Denis-Courmont's avatar Rémi Denis-Courmont

Factorize the gcrypt thread support

parent ab95c5fa
/*****************************************************************************
* 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);
}
...@@ -46,13 +46,15 @@ ...@@ -46,13 +46,15 @@
#endif #endif
#include "vlc_tls.h" #include <vlc_tls.h>
#include <vlc_charset.h> #include <vlc_charset.h>
#include <gcrypt.h> #include <gcrypt.h>
#include <gnutls/gnutls.h> #include <gnutls/gnutls.h>
#include <gnutls/x509.h> #include <gnutls/x509.h>
#include <vlc_gcrypt.h>
#define CACHE_TIMEOUT 3600 #define CACHE_TIMEOUT 3600
#define CACHE_SIZE 64 #define CACHE_SIZE 64
...@@ -101,64 +103,6 @@ vlc_module_begin(); ...@@ -101,64 +103,6 @@ vlc_module_begin();
CACHE_SIZE_LONGTEXT, true ); CACHE_SIZE_LONGTEXT, true );
vlc_module_end(); 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. * Initializes GnuTLS with proper locking.
* @return VLC_SUCCESS on success, a VLC error code otherwise. * @return VLC_SUCCESS on success, a VLC error code otherwise.
...@@ -167,9 +111,9 @@ static int gnutls_Init (vlc_object_t *p_this) ...@@ -167,9 +111,9 @@ static int gnutls_Init (vlc_object_t *p_this)
{ {
int ret = VLC_EGENERIC; 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 ()) if (gnutls_global_init ())
{ {
msg_Err (p_this, "cannot initialize GnuTLS"); msg_Err (p_this, "cannot initialize GnuTLS");
......
...@@ -73,6 +73,7 @@ noinst_HEADERS = \ ...@@ -73,6 +73,7 @@ noinst_HEADERS = \
../include/vlc_events.h \ ../include/vlc_events.h \
../include/vlc_filter.h \ ../include/vlc_filter.h \
../include/vlc_fixups.h \ ../include/vlc_fixups.h \
../include/vlc_gcrypt.h \
../include/vlc_httpd.h \ ../include/vlc_httpd.h \
../include/vlc_image.h \ ../include/vlc_image.h \
../include/vlc_input.h \ ../include/vlc_input.h \
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment