[vlc-devel] commit: DynamicOverlay: fix a race condition (psz_(input|output) file must be protected ( Rémi Duraffort )
git version control
git at videolan.org
Fri Jun 26 14:42:06 CEST 2009
vlc | branch: 1.0-bugfix | Rémi Duraffort <ivoire at videolan.org> | Fri Jun 26 09:37:56 2009 +0200| [99801bf2501d9358f8c55ed2e8b1bb8bb076a5a8] | committer: Rémi Duraffort
DynamicOverlay: fix a race condition (psz_(input|output)file must be protected
by a mutex).
(cherry picked from commit cc728a7dade62ca26e244978a554005a4971b91e)
Signed-off-by: Rémi Duraffort <ivoire at videolan.org>
> http://git.videolan.org/gitweb.cgi/vlc.git/?a=commit;h=99801bf2501d9358f8c55ed2e8b1bb8bb076a5a8
---
.../video_filter/dynamicoverlay/dynamicoverlay.c | 6 ++++++
.../video_filter/dynamicoverlay/dynamicoverlay.h | 2 ++
2 files changed, 8 insertions(+), 0 deletions(-)
diff --git a/modules/video_filter/dynamicoverlay/dynamicoverlay.c b/modules/video_filter/dynamicoverlay/dynamicoverlay.c
index 07c8c37..43ae5ed 100644
--- a/modules/video_filter/dynamicoverlay/dynamicoverlay.c
+++ b/modules/video_filter/dynamicoverlay/dynamicoverlay.c
@@ -108,6 +108,7 @@ static int Create( vlc_object_t *p_this )
p_sys->i_outputfd = -1;
p_sys->b_updated = true;
p_sys->b_atomic = false;
+ vlc_mutex_init( &p_sys->lock );
p_filter->pf_sub_filter = Filter;
@@ -147,6 +148,7 @@ static void Destroy( vlc_object_t *p_this )
var_DelCallback( p_filter, "overlay-input", AdjustCallback, p_sys );
var_DelCallback( p_filter, "overlay-output", AdjustCallback, p_sys );
+ vlc_mutex_destroy( &p_sys->lock );
free( p_sys->psz_inputfile );
free( p_sys->psz_outputfile );
free( p_sys );
@@ -164,6 +166,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
filter_sys_t *p_sys = p_filter->p_sys;
/* We might need to open these at any time. */
+ vlc_mutex_lock( &p_sys->lock );
if( p_sys->i_inputfd == -1 )
{
p_sys->i_inputfd = open( p_sys->psz_inputfile, O_RDONLY | O_NONBLOCK );
@@ -197,6 +200,7 @@ static subpicture_t *Filter( filter_t *p_filter, mtime_t date )
p_sys->psz_outputfile );
}
}
+ vlc_mutex_unlock( &p_sys->lock );
/* Read any waiting commands */
if( p_sys->i_inputfd != -1 )
@@ -389,6 +393,7 @@ static int AdjustCallback( vlc_object_t *p_this, char const *psz_var,
filter_sys_t *p_sys = (filter_sys_t *)p_data;
VLC_UNUSED(p_this); VLC_UNUSED(oldval);
+ vlc_mutex_lock( &p_sys->lock );
if( !strncmp( psz_var, "overlay-input", 13 ) )
{
free( p_sys->psz_inputfile );
@@ -399,6 +404,7 @@ static int AdjustCallback( vlc_object_t *p_this, char const *psz_var,
free( p_sys->psz_outputfile );
p_sys->psz_outputfile = strdup( newval.psz_string );
}
+ vlc_mutex_unlock( &p_sys->lock );
return VLC_EGENERIC;
}
diff --git a/modules/video_filter/dynamicoverlay/dynamicoverlay.h b/modules/video_filter/dynamicoverlay/dynamicoverlay.h
index 8eb500a..20ce463 100644
--- a/modules/video_filter/dynamicoverlay/dynamicoverlay.h
+++ b/modules/video_filter/dynamicoverlay/dynamicoverlay.h
@@ -165,6 +165,8 @@ struct filter_sys_t
bool b_updated, b_atomic;
queue_t atomic, pending, processed;
list_t overlays;
+
+ vlc_mutex_t lock; /* lock to protect psz_inputfile and psz_outputfile */
};
#endif
More information about the vlc-devel
mailing list