VLC
2.1.0-git
Main Page
Related Pages
Modules
Data Structures
Files
File List
Globals
All
Data Structures
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
include
vlc_gcrypt.h
Go to the documentation of this file.
1
/*****************************************************************************
2
* vlc_gcrypt.h: VLC thread support for gcrypt
3
*****************************************************************************
4
* Copyright (C) 2004-2010 Rémi Denis-Courmont
5
*
6
* This program is free software; you can redistribute it and/or modify it
7
* under the terms of the GNU Lesser General Public License as published by
8
* the Free Software Foundation; either version 2.1 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 Lesser General Public License for more details.
15
*
16
* You should have received a copy of the GNU Lesser General Public License
17
* along with this program; if not, write to the Free Software Foundation,
18
* Inc., 51 Franklin Street, Fifth Floor, Boston MA 02110-1301, USA.
19
*****************************************************************************/
20
21
/**
22
* \file
23
* This file implements gcrypt support functions in vlc
24
*/
25
26
#include <errno.h>
27
28
#ifdef LIBVLC_USE_PTHREAD
29
/**
30
* If possible, use gcrypt-provided thread implementation. This is so that
31
* other non-VLC components (inside the process) can also use gcrypt safely.
32
*/
33
GCRY_THREAD_OPTION_PTHREAD_IMPL
;
34
# define gcry_threads_vlc gcry_threads_pthread
35
#else
36
37
/**
38
* gcrypt thread option VLC implementation
39
*/
40
41
static
int
gcry_vlc_mutex_init(
void
**p_sys )
42
{
43
vlc_mutex_t
*p_lock = (
vlc_mutex_t
*)malloc(
sizeof
(
vlc_mutex_t
) );
44
if
( p_lock == NULL)
45
return
ENOMEM;
46
47
vlc_mutex_init
( p_lock );
48
*p_sys = p_lock;
49
return
VLC_SUCCESS
;
50
}
51
52
static
int
gcry_vlc_mutex_destroy(
void
**p_sys )
53
{
54
vlc_mutex_t
*p_lock = (
vlc_mutex_t
*)*p_sys;
55
vlc_mutex_destroy
( p_lock );
56
free( p_lock );
57
return
VLC_SUCCESS
;
58
}
59
60
static
int
gcry_vlc_mutex_lock(
void
**p_sys )
61
{
62
vlc_mutex_lock
( (
vlc_mutex_t
*)*p_sys );
63
return
VLC_SUCCESS
;
64
}
65
66
static
int
gcry_vlc_mutex_unlock(
void
**
lock
)
67
{
68
vlc_mutex_unlock
( (
vlc_mutex_t
*)*lock );
69
return
VLC_SUCCESS
;
70
}
71
72
static
const
struct
gcry_thread_cbs
gcry_threads_vlc
=
73
{
74
GCRY_THREAD_OPTION_USER,
75
NULL,
76
gcry_vlc_mutex_init,
77
gcry_vlc_mutex_destroy,
78
gcry_vlc_mutex_lock,
79
gcry_vlc_mutex_unlock,
80
NULL, NULL, NULL, NULL, NULL, NULL, NULL, NULL
81
};
82
#endif
83
84
/**
85
* Initializes gcrypt with proper locking.
86
*/
87
static
inline
void
vlc_gcrypt_init
(
void
)
88
{
89
/* This would need a process-wide static mutex with all libraries linking
90
* to a given instance of libgcrypt. We cannot do this as we have different
91
* plugins linking with gcrypt, and some underlying libraries may use it
92
* behind our back. Only way is to always link gcrypt statically (ouch!) or
93
* have upstream gcrypt provide one shared object per threading system. */
94
static
bool
done =
false
;
95
96
vlc_global_lock
(
VLC_GCRYPT_MUTEX
);
97
if
(!done)
98
{
99
gcry_control (GCRYCTL_SET_THREAD_CBS, &gcry_threads_vlc);
100
done =
true
;
101
}
102
vlc_global_unlock
(
VLC_GCRYPT_MUTEX
);
103
}
Generated by
1.8.1.2