Skip to content
GitLab
Projects
Groups
Snippets
/
Help
Help
Support
Community forum
Keyboard shortcuts
?
Submit feedback
Sign in
Toggle navigation
Menu
Open sidebar
Steve Lhomme
VLC
Commits
e3984284
Commit
e3984284
authored
Oct 05, 2008
by
Rémi Denis-Courmont
Browse files
Use static mutexes
parent
917aae76
Changes
18
Hide whitespace changes
Inline
Side-by-side
include/vlc_gcrypt.h
View file @
e3984284
...
...
@@ -88,7 +88,19 @@ static const struct gcry_thread_cbs gcry_threads_vlc =
*/
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
);
/* This would need a process-wide static mutex with all libraries linking
* to a given instance of libgcrypt. We cannot do this as we have different
* plugins linking with gcrypt, and some underlying libraries may use it
* behind our back. Only way is to always link gcrypt statically (ouch!) or
* have upstream gcrypt provide one shared object per threading system. */
static
vlc_mutex_t
lock
=
VLC_STATIC_MUTEX
;
static
bool
done
=
false
;
vlc_mutex_lock
(
&
lock
);
if
(
!
done
)
{
gcry_control
(
GCRYCTL_SET_THREAD_CBS
,
&
gcry_threads_vlc
);
done
=
true
;
}
vlc_mutex_unlock
(
&
lock
);
}
modules/codec/avcodec/audio.c
View file @
e3984284
...
...
@@ -180,23 +180,17 @@ int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
}
/* ***** Open the codec ***** */
vlc_mutex_t
*
lock
=
var_AcquireMutex
(
"avcodec"
);
if
(
lock
==
NULL
)
{
free
(
p_sys
->
p_context
->
extradata
);
free
(
p_sys
);
return
VLC_ENOMEM
;
}
vlc_mutex_lock
(
&
avcodec_lock
);
if
(
avcodec_open
(
p_sys
->
p_context
,
p_sys
->
p_codec
)
<
0
)
{
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Err
(
p_dec
,
"cannot open codec (%s)"
,
p_sys
->
psz_namecodec
);
free
(
p_sys
->
p_context
->
extradata
);
free
(
p_sys
);
return
VLC_EGENERIC
;
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Dbg
(
p_dec
,
"ffmpeg codec (%s) started"
,
p_sys
->
psz_namecodec
);
...
...
modules/codec/avcodec/avcodec.c
View file @
e3984284
...
...
@@ -202,6 +202,8 @@ vlc_module_begin();
vlc_module_end
();
vlc_mutex_t
avcodec_lock
=
VLC_STATIC_MUTEX
;
/*****************************************************************************
* OpenDecoder: probe the decoder and return score
*****************************************************************************/
...
...
@@ -319,9 +321,9 @@ static void CloseDecoder( vlc_object_t *p_this )
free
(
p_sys
->
p_context
->
extradata
);
p_sys
->
p_context
->
extradata
=
NULL
;
lock
=
var_AcquireMutex
(
"
avcodec
"
);
vlc_mutex_lock
(
&
avcodec
_lock
);
avcodec_close
(
p_sys
->
p_context
);
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Dbg
(
p_dec
,
"ffmpeg codec (%s) stopped"
,
p_sys
->
psz_namecodec
);
av_free
(
p_sys
->
p_context
);
}
...
...
@@ -331,8 +333,9 @@ static void CloseDecoder( vlc_object_t *p_this )
void
InitLibavcodec
(
vlc_object_t
*
p_object
)
{
static
int
b_ffmpeginit
=
0
;
vlc_mutex_t
*
lock
=
var_AcquireMutex
(
"avcodec"
);
static
bool
b_ffmpeginit
=
false
;
vlc_mutex_lock
(
&
avcodec_lock
);
/* *** init ffmpeg library (libavcodec) *** */
if
(
!
b_ffmpeginit
)
...
...
@@ -340,9 +343,9 @@ void InitLibavcodec( vlc_object_t *p_object )
avcodec_init
();
avcodec_register_all
();
av_log_set_callback
(
LibavutilCallback
);
b_ffmpeginit
=
1
;
b_ffmpeginit
=
true
;
msg_Dbg
(
p_object
,
"libavcodec initialized (interface
%d
)"
,
msg_Dbg
(
p_object
,
"libavcodec initialized (interface
0x%x
)"
,
LIBAVCODEC_VERSION_INT
);
}
else
...
...
@@ -350,5 +353,5 @@ void InitLibavcodec( vlc_object_t *p_object )
msg_Dbg
(
p_object
,
"libavcodec already initialized"
);
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
}
modules/codec/avcodec/avcodec.h
View file @
e3984284
...
...
@@ -48,6 +48,9 @@ int InitAudioDec( decoder_t *p_dec, AVCodecContext *p_context,
AVCodec
*
p_codec
,
int
i_codec_id
,
const
char
*
psz_namecodec
);
void
EndAudioDec
(
decoder_t
*
p_dec
);
/* Avcodec global lock */
extern
vlc_mutex_t
avcodec_lock
;
/*****************************************************************************
* Module descriptor help strings
*****************************************************************************/
...
...
modules/codec/avcodec/encoder.c
View file @
e3984284
...
...
@@ -604,11 +604,11 @@ int OpenEncoder( vlc_object_t *p_this )
p_context
->
extradata
=
NULL
;
p_context
->
flags
|=
CODEC_FLAG_GLOBAL_HEADER
;
vlc_mutex_
t
*
lock
=
var_AcquireMutex
(
"
avcodec
"
);
vlc_mutex_lock
(
&
avcodec
_lock
);
if
(
avcodec_open
(
p_context
,
p_codec
)
)
{
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
if
(
p_enc
->
fmt_in
.
i_cat
==
AUDIO_ES
&&
(
p_context
->
channels
>
2
||
i_codec_id
==
CODEC_ID_MP2
||
i_codec_id
==
CODEC_ID_MP3
)
)
...
...
@@ -658,10 +658,10 @@ int OpenEncoder( vlc_object_t *p_this )
}
p_context
->
codec
=
NULL
;
vlc_mutex_lock
(
lock
);
vlc_mutex_lock
(
&
avcodec_
lock
);
if
(
avcodec_open
(
p_context
,
p_codec
)
)
{
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Err
(
p_enc
,
"cannot open encoder"
);
intf_UserFatal
(
p_enc
,
false
,
_
(
"Streaming / Transcoding failed"
),
...
...
@@ -679,7 +679,7 @@ int OpenEncoder( vlc_object_t *p_this )
return
VLC_EGENERIC
;
}
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
p_enc
->
fmt_out
.
i_extra
=
p_context
->
extradata_size
;
if
(
p_enc
->
fmt_out
.
i_extra
)
...
...
@@ -1111,9 +1111,9 @@ void CloseEncoder( vlc_object_t *p_this )
free
(
pp_contexts
);
}
vlc_mutex_
t
*
lock
=
var_AcquireMutex
(
"
avcodec
"
);
vlc_mutex_lock
(
&
avcodec
_lock
);
avcodec_close
(
p_sys
->
p_context
);
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
av_free
(
p_sys
->
p_context
);
free
(
p_sys
->
p_buffer
);
...
...
modules/codec/avcodec/video.c
View file @
e3984284
...
...
@@ -383,23 +383,16 @@ int InitVideoDec( decoder_t *p_dec, AVCodecContext *p_context,
}
/* ***** Open the codec ***** */
vlc_mutex_t
*
lock
=
var_AcquireMutex
(
"avcodec"
);
if
(
lock
==
NULL
)
{
free
(
p_sys
->
p_buffer_orig
);
free
(
p_sys
);
return
VLC_ENOMEM
;
}
vlc_mutex_lock
(
&
avcodec_lock
);
if
(
avcodec_open
(
p_sys
->
p_context
,
p_sys
->
p_codec
)
<
0
)
{
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Err
(
p_dec
,
"cannot open codec (%s)"
,
p_sys
->
psz_namecodec
);
free
(
p_sys
->
p_buffer_orig
);
free
(
p_sys
);
return
VLC_EGENERIC
;
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
avcodec_
lock
);
msg_Dbg
(
p_dec
,
"ffmpeg codec (%s) started"
,
p_sys
->
psz_namecodec
);
...
...
modules/codec/libass.c
View file @
e3984284
...
...
@@ -72,7 +72,6 @@ typedef struct
{
vlc_object_t
*
p_libvlc
;
vlc_mutex_t
*
p_lock
;
int
i_refcount
;
ass_library_t
*
p_library
;
ass_renderer_t
*
p_renderer
;
...
...
@@ -120,6 +119,8 @@ static int BuildRegions( spu_t *p_spu, rectangle_t *p_region, int i_max_region,
static
void
SubpictureReleaseRegions
(
spu_t
*
p_spu
,
subpicture_t
*
p_subpic
);
static
void
RegionDraw
(
subpicture_region_t
*
p_region
,
ass_image_t
*
p_img
);
static
vlc_mutex_t
libass_lock
=
VLC_STATIC_MUTEX
;
//#define DEBUG_REGION
/*****************************************************************************
...
...
@@ -151,16 +152,16 @@ static int Create( vlc_object_t *p_this )
p_sys
->
i_refcount
=
1
;
/* Add a track */
vlc_mutex_lock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_lock
(
&
libass
_lock
);
p_sys
->
p_track
=
p_track
=
ass_new_track
(
p_sys
->
p_ass
->
p_library
);
if
(
!
p_track
)
{
vlc_mutex_unlock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
DecSysRelease
(
p_sys
);
return
VLC_EGENERIC
;
}
ass_process_codec_private
(
p_track
,
p_dec
->
fmt_in
.
p_extra
,
p_dec
->
fmt_in
.
i_extra
);
vlc_mutex_unlock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
VLC_SUCCESS
;
}
...
...
@@ -194,10 +195,10 @@ static void DecSysRelease( decoder_sys_t *p_sys )
vlc_mutex_unlock
(
&
p_sys
->
lock
);
vlc_mutex_destroy
(
&
p_sys
->
lock
);
vlc_mutex_lock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_lock
(
&
libass
_lock
);
if
(
p_sys
->
p_track
)
ass_free_track
(
p_sys
->
p_track
);
vlc_mutex_unlock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
AssHandleRelease
(
p_sys
->
p_ass
);
free
(
p_sys
);
...
...
@@ -264,13 +265,13 @@ static subpicture_t *DecodeBlock( decoder_t *p_dec, block_t **pp_block )
p_spu
->
b_ephemer
=
true
;
p_spu
->
b_absolute
=
true
;
vlc_mutex_lock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_lock
(
&
libass
_lock
);
if
(
p_sys
->
p_track
)
{
ass_process_chunk
(
p_sys
->
p_track
,
p_spu
->
p_sys
->
p_subs_data
,
p_spu
->
p_sys
->
i_subs_len
,
p_spu
->
i_start
/
1000
,
(
p_spu
->
i_stop
-
p_spu
->
i_start
)
/
1000
);
}
vlc_mutex_unlock
(
p_sys
->
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
p_spu
->
pf_pre_render
=
PreRender
;
p_spu
->
pf_update_regions
=
UpdateRegions
;
...
...
@@ -320,7 +321,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
return
;
}
vlc_mutex_lock
(
p_ass
->
p
_lock
);
vlc_mutex_lock
(
&
libass
_lock
);
/* */
fmt
=
*
p_fmt
;
...
...
@@ -347,7 +348,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
if
(
!
i_changed
&&
!
b_fmt_changed
)
{
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
;
}
...
...
@@ -368,7 +369,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
if
(
i_region
<=
0
)
{
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
;
}
...
...
@@ -402,7 +403,7 @@ static void UpdateRegions( spu_t *p_spu, subpicture_t *p_subpic,
*
pp_region_last
=
r
;
pp_region_last
=
&
r
->
p_next
;
}
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
}
static
rectangle_t
r_create
(
int
x0
,
int
y0
,
int
x1
,
int
y1
)
...
...
@@ -616,9 +617,7 @@ static void SubpictureReleaseRegions( spu_t *p_spu, subpicture_t *p_subpic )
/* */
static
ass_handle_t
*
AssHandleHold
(
decoder_t
*
p_dec
)
{
vlc_mutex_t
*
p_lock
=
var_AcquireMutex
(
"libass"
);
if
(
!
p_lock
)
return
NULL
;
vlc_mutex_lock
(
&
libass_lock
);
ass_handle_t
*
p_ass
=
NULL
;
ass_library_t
*
p_library
=
NULL
;
...
...
@@ -635,7 +634,7 @@ static ass_handle_t *AssHandleHold( decoder_t *p_dec )
p_ass
->
i_refcount
++
;
vlc_mutex_unlock
(
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
p_ass
;
}
...
...
@@ -646,7 +645,6 @@ static ass_handle_t *AssHandleHold( decoder_t *p_dec )
/* */
p_ass
->
p_libvlc
=
VLC_OBJECT
(
p_dec
->
p_libvlc
);
p_ass
->
p_lock
=
p_lock
;
p_ass
->
i_refcount
=
1
;
/* Create libass library */
...
...
@@ -713,7 +711,7 @@ static ass_handle_t *AssHandleHold( decoder_t *p_dec )
var_Set
(
p_dec
->
p_libvlc
,
"libass-handle"
,
val
);
/* */
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
p_ass
;
error:
...
...
@@ -723,16 +721,16 @@ error:
ass_library_done
(
p_library
);
free
(
p_ass
);
vlc_mutex_unlock
(
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
NULL
;
}
static
void
AssHandleRelease
(
ass_handle_t
*
p_ass
)
{
vlc_mutex_lock
(
p_ass
->
p
_lock
);
vlc_mutex_lock
(
&
libass
_lock
);
p_ass
->
i_refcount
--
;
if
(
p_ass
->
i_refcount
>
0
)
{
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
return
;
}
...
...
@@ -743,7 +741,7 @@ static void AssHandleRelease( ass_handle_t *p_ass )
val
.
p_address
=
NULL
;
var_Set
(
p_ass
->
p_libvlc
,
"libass-handle"
,
val
);
vlc_mutex_unlock
(
p_ass
->
p
_lock
);
vlc_mutex_unlock
(
&
libass
_lock
);
free
(
p_ass
);
}
modules/codec/quicktime.c
View file @
e3984284
...
...
@@ -326,6 +326,8 @@ static int Open( vlc_object_t *p_this )
}
}
static
vlc_mutex_t
qt_mutex
=
VLC_STATIC_MUTEX
;
/*****************************************************************************
* Close:
*****************************************************************************/
...
...
@@ -333,10 +335,9 @@ static void Close( vlc_object_t *p_this )
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
vlc_mutex_t
*
lock
;
/* get lock, avoid segfault */
lock
=
var_AcquireMutex
(
"
qt_mutex
"
);
vlc_mutex_lock
(
&
qt_mutex
);
if
(
p_dec
->
fmt_out
.
i_cat
==
AUDIO_ES
)
{
...
...
@@ -375,7 +376,7 @@ static void Close( vlc_object_t *p_this )
#endif
#endif
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
free
(
p_sys
);
}
...
...
@@ -394,9 +395,7 @@ static int OpenAudio( decoder_t *p_dec )
unsigned
long
OutputBufferSize
=
0
;
/* get lock, avoid segfault */
vlc_mutex_t
*
lock
=
var_AcquireMutex
(
"qt_mutex"
);
if
(
lock
==
NULL
)
return
VLC_EGENERIC
;
vlc_mutex_lock
(
&
qt_mutex
);
p_sys
=
calloc
(
sizeof
(
decoder_sys_t
),
1
);
p_dec
->
p_sys
=
p_sys
;
...
...
@@ -515,7 +514,7 @@ static int OpenAudio( decoder_t *p_dec )
p_sys
->
i_out
=
0
;
p_sys
->
i_out_frames
=
0
;
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
return
VLC_SUCCESS
;
exit_error:
...
...
@@ -523,7 +522,7 @@ exit_error:
#ifdef LOADER
Restore_LDT_Keeper
(
p_sys
->
ldt_fs
);
#endif
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
free
(
p_sys
);
return
VLC_EGENERIC
;
...
...
@@ -595,7 +594,7 @@ static aout_buffer_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
{
int
i_frames
=
p_sys
->
i_buffer
/
p_sys
->
InFrameSize
;
unsigned
long
i_out_frames
,
i_out_bytes
;
vlc_mutex_
t
*
lock
=
var_AcquireMutex
(
"
qt_mutex
"
);
vlc_mutex_lock
(
&
qt_mutex
);
i_error
=
p_sys
->
SoundConverterConvertBuffer
(
p_sys
->
myConverter
,
p_sys
->
p_buffer
,
...
...
@@ -603,7 +602,7 @@ static aout_buffer_t *DecodeAudio( decoder_t *p_dec, block_t **pp_block )
p_sys
->
out_buffer
,
&
i_out_frames
,
&
i_out_bytes
);
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
/*
msg_Dbg( p_dec, "decoded %d frames -> %ld frames (error=%d)",
...
...
@@ -674,7 +673,6 @@ static int OpenVideo( decoder_t *p_dec )
return
VLC_ENOMEM
;
#ifndef WIN32
vlc_mutex_t
*
lock
;
long
i_result
;
ComponentDescription
desc
;
Component
prev
;
...
...
@@ -703,7 +701,7 @@ static int OpenVideo( decoder_t *p_dec )
fcc
,
p_dec
->
fmt_in
.
video
.
i_width
,
p_dec
->
fmt_in
.
video
.
i_height
);
/* get lock, avoid segfault */
lock
=
var_AcquireMutex
(
"
qt_mutex
"
);
vlc_mutex_lock
(
&
qt_mutex
);
#ifdef __APPLE__
EnterMovies
();
...
...
@@ -845,14 +843,14 @@ static int OpenVideo( decoder_t *p_dec )
p_dec
->
fmt_out
.
video
.
i_height
=
p_dec
->
fmt_in
.
video
.
i_height
;
p_dec
->
fmt_out
.
video
.
i_aspect
=
VOUT_ASPECT_FACTOR
*
p_dec
->
fmt_in
.
video
.
i_width
/
p_dec
->
fmt_in
.
video
.
i_height
;
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
return
VLC_SUCCESS
;
exit_error:
#ifdef LOADER
Restore_LDT_Keeper
(
p_sys
->
ldt_fs
);
#endif
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
#endif
/* !WIN32 */
...
...
@@ -866,7 +864,6 @@ exit_error:
static
picture_t
*
DecodeVideo
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
vlc_mutex_t
*
lock
;
block_t
*
p_block
;
picture_t
*
p_pic
;
mtime_t
i_pts
;
...
...
@@ -916,7 +913,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
return
NULL
;
}
lock
=
var_AcquireMutex
(
"
qt_mutex
"
);
vlc_mutex_lock
(
&
qt_mutex
);
if
(
(
p_pic
=
p_dec
->
pf_vout_buffer_new
(
p_dec
)
)
)
{
...
...
@@ -940,7 +937,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
p_pic
->
date
=
i_pts
;
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
qt_mutex
);
block_Release
(
p_block
);
return
p_pic
;
...
...
modules/codec/realvideo.c
View file @
e3984284
...
...
@@ -203,12 +203,13 @@ static void * load_syms_linux(decoder_t *p_dec, const char *path)
}
#endif
static
vlc_mutex_t
rm_mutex
=
VLC_STATIC_MUTEX
;
static
int
InitVideo
(
decoder_t
*
p_dec
)
{
int
result
;
struct
rv_init_t
init_data
;
char
fcc
[
4
];
vlc_mutex_t
*
lock
;
char
*
g_decode_path
;
int
i_vide
=
p_dec
->
fmt_in
.
i_extra
;
...
...
@@ -309,9 +310,7 @@ static int InitVideo(decoder_t *p_dec)
return
VLC_EGENERIC
;
}
lock
=
var_AcquireMutex
(
"rm_mutex"
);
if
(
lock
==
NULL
)
return
VLC_EGENERIC
;
vlc_mutex_lock
(
&
rm_mutex
);
p_sys
->
handle
=
NULL
;
#ifdef WIN32
...
...
@@ -358,7 +357,7 @@ static int InitVideo(decoder_t *p_dec)
p_dec
->
fmt_out
.
video
.
i_aspect
=
VOUT_ASPECT_FACTOR
*
p_dec
->
fmt_in
.
video
.
i_width
/
p_dec
->
fmt_in
.
video
.
i_height
;
p_sys
->
inited
=
0
;
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
rm_mutex
);
return
VLC_SUCCESS
;
}
...
...
@@ -397,10 +396,9 @@ static void Close( vlc_object_t *p_this )
{
decoder_t
*
p_dec
=
(
decoder_t
*
)
p_this
;
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
vlc_mutex_t
*
lock
;
/* get lock, avoid segfault */
lock
=
var_AcquireMutex
(
"
rm_mutex
"
);
vlc_mutex_lock
(
&
rm_mutex
);
#ifdef WIN32
if
(
dll_type
==
1
)
...
...
@@ -435,8 +433,7 @@ static void Close( vlc_object_t *p_this )
#endif
p_sys
->
inited
=
0
;
if
(
lock
)
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
rm_mutex
);
if
(
p_sys
)
free
(
p_sys
);
...
...
@@ -448,7 +445,6 @@ static void Close( vlc_object_t *p_this )
static
picture_t
*
DecodeVideo
(
decoder_t
*
p_dec
,
block_t
**
pp_block
)
{
decoder_sys_t
*
p_sys
=
p_dec
->
p_sys
;
vlc_mutex_t
*
lock
;
block_t
*
p_block
;
picture_t
*
p_pic
;
mtime_t
i_pts
;
...
...
@@ -465,9 +461,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
i_pts
=
p_block
->
i_pts
?
p_block
->
i_pts
:
p_block
->
i_dts
;
lock
=
var_AcquireMutex
(
"rm_mutex"
);
if
(
lock
==
NULL
)
return
NULL
;
vlc_mutex_lock
(
&
rm_mutex
);
p_pic
=
p_dec
->
pf_vout_buffer_new
(
p_dec
);
...
...
@@ -559,7 +553,7 @@ static picture_t *DecodeVideo( decoder_t *p_dec, block_t **pp_block )
p_pic
->
b_force
=
1
;
}
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
rm_mutex
);
block_Release
(
p_block
);
return
p_pic
;
...
...
modules/misc/freetype.c
View file @
e3984284
...
...
@@ -233,7 +233,7 @@ static void FreeLines( line_desc_t * );
static
void
FreeLine
(
line_desc_t
*
);
#ifdef HAVE_FONTCONFIG
static
vlc_object_t
*
FontBuilderAttach
(
filter_t
*
p_filter
,
vlc_mutex_t
**
pp_lock
);
static
vlc_object_t
*
FontBuilderAttach
(
filter_t
*
p_filter
);
static
void
FontBuilderDetach
(
filter_t
*
p_filter
,
vlc_object_t
*
p_fontbuilder
);
static
void
*
FontBuilderThread
(
vlc_object_t
*
p_this
);
static
void
FontBuilderDestructor
(
vlc_object_t
*
p_this
);
...
...
@@ -261,7 +261,6 @@ struct filter_sys_t
int
i_default_font_size
;
int
i_display_height
;
#ifdef HAVE_FONTCONFIG
vlc_mutex_t
*
p_fontconfig_lock
;
bool
b_fontconfig_ok
;
FcConfig
*
p_fontconfig
;
#endif
...
...
@@ -367,7 +366,7 @@ static int Create( vlc_object_t *p_this )
#ifdef HAVE_FONTCONFIG
p_sys
->
b_fontconfig_ok
=
false
;
p_sys
->
p_fontconfig
=
NULL
;
p_sys
->
p_fontbuilder
=
FontBuilderAttach
(
p_filter
,
&
p_sys
->
p_fontconfig_lock
);
p_sys
->
p_fontbuilder
=
FontBuilderAttach
(
p_filter
);
#endif
p_sys
->
i_use_kerning
=
FT_HAS_KERNING
(
p_sys
->
p_face
);
...
...
@@ -434,10 +433,12 @@ static void Destroy( vlc_object_t *p_this )
}
#ifdef HAVE_FONTCONFIG
static
vlc_object_t
*
FontBuilderAttach
(
filter_t
*
p_filter
,
vlc_mutex_t
**
pp_lock
)
static
vlc_mutex_t
fb_lock
=
VLC_STATIC_MUTEX
;
static
vlc_object_t
*
FontBuilderAttach
(
filter_t
*
p_filter
)
{
/* Check for an existing Fontbuilder thread */
vlc_mutex_
t
*
p_lock
=
var_AcquireMutex
(
"fontbuilder"
);
vlc_mutex_
lock
(
&
fb_lock
);
vlc_object_t
*
p_fontbuilder
=
vlc_object_find_name
(
p_filter
->
p_libvlc
,
"fontlist builder"
,
FIND_CHILD
);
...
...
@@ -482,13 +483,12 @@ static vlc_object_t *FontBuilderAttach( filter_t *p_filter, vlc_mutex_t **pp_loc
var_AddCallback
(
p_fontbuilder
,
"build-done"
,
FontBuilderDone
,
p_filter
);
FontBuilderGetFcConfig
(
p_filter
,
p_fontbuilder
);
}
vlc_mutex_unlock
(
p_lock
);
*
pp_lock
=
p_lock
;
vlc_mutex_unlock
(
&
fb_lock
);
return
p_fontbuilder
;
}
static
void
FontBuilderDetach
(
filter_t
*
p_filter
,
vlc_object_t
*
p_fontbuilder
)
{
vlc_mutex_
t
*
lock
=
var_AcquireMutex
(
"fontbuilder"
);
vlc_mutex_lock
(
&
fb_lock
);
if
(
p_fontbuilder
)
{
const
bool
b_alive
=
vlc_object_alive
(
p_fontbuilder
);
...
...
@@ -499,18 +499,18 @@ static void FontBuilderDetach( filter_t *p_filter, vlc_object_t *p_fontbuilder )
if
(
b_alive
)
{
vlc_object_kill
(
p_fontbuilder
);
vlc_mutex_unlock
(
lock
);
vlc_mutex_unlock
(
&
fb_
lock
);
/* We need to unlock otherwise we may not join (the thread waiting
* for the lock). It is safe to unlock as no one else will try a
* join and we have a reference on the object) */
vlc_thread_join
(
p_fontbuilder
);