]> git.sesse.net Git - vlc/blob - include/vlc_gcrypt.h
mkv: Remove an unneeded test.
[vlc] / include / vlc_gcrypt.h
1 /*****************************************************************************
2  * vlc_gcrypt.h: VLC thread support for gcrypt
3  *****************************************************************************
4  * Copyright (C) 2004-2008 RĂ©mi Denis-Courmont
5  *
6  * This program is free software; you can redistribute it and/or modify
7  * it under the terms of the GNU General Public License as published by
8  * the Free Software Foundation; either version 2 of the License, or
9  * (at your option) any later version.
10  *
11  * This program is distributed in the hope that it will be useful,
12  * but WITHOUT ANY WARRANTY; without even the implied warranty of
13  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
14  * GNU General Public License for more details.
15  *
16  * You should have received a copy of the GNU General Public License
17  * along with this program; if not, write to the Free Software
18  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19  *****************************************************************************/
20
21 #ifdef LIBVLC_USE_PTHREAD
22 /**
23  * If possible, use gcrypt-provided thread implementation. This is so that
24  * other non-VLC components (inside the process) can also use gcrypt safely.
25  */
26 GCRY_THREAD_OPTION_PTHREAD_IMPL;
27 # define gcry_threads_vlc gcry_threads_pthread
28 #else
29 /**
30  * gcrypt thread option VLC implementation
31  */
32
33 static int gcry_vlc_mutex_init( void **p_sys )
34 {
35     int i_val;
36     vlc_mutex_t *p_lock = (vlc_mutex_t *)malloc( sizeof( vlc_mutex_t ) );
37
38     if( p_lock == NULL)
39         return ENOMEM;
40
41     i_val = vlc_mutex_init( p_lock );
42     if( i_val )
43         free( p_lock );
44     else
45         *p_sys = p_lock;
46     return i_val;
47 }
48
49 static int gcry_vlc_mutex_destroy( void **p_sys )
50 {
51     vlc_mutex_t *p_lock = (vlc_mutex_t *)*p_sys;
52     vlc_mutex_destroy( p_lock );
53     free( p_lock );
54     return VLC_SUCCESS;
55 }
56
57 static int gcry_vlc_mutex_lock( void **p_sys )
58 {
59     vlc_mutex_lock( (vlc_mutex_t *)*p_sys );
60     return VLC_SUCCESS;
61 }
62
63 static int gcry_vlc_mutex_unlock( void **lock )
64 {
65     vlc_mutex_unlock( (vlc_mutex_t *)*lock );
66     return VLC_SUCCESS;
67 }
68
69 static struct gcry_thread_cbs gcry_threads_vlc =
70 {
71     GCRY_THREAD_OPTION_USER,
72     NULL,
73     gcry_vlc_mutex_init,
74     gcry_vlc_mutex_destroy,
75     gcry_vlc_mutex_lock,
76     gcry_vlc_mutex_unlock
77 };
78 #endif
79
80 /**
81  * Initializes gcrypt with proper locking.
82  */
83 static inline void vlc_gcrypt_init (void)
84 {
85     vlc_mutex_t *lock = var_AcquireMutex ("gcrypt_mutex");
86     gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc);
87     vlc_mutex_unlock (lock);
88 }