From 09a1fc830966622127eca57de8d1bc4145694057 Mon Sep 17 00:00:00 2001 From: Gildas Bazin Date: Thu, 30 Jan 2003 12:38:13 +0000 Subject: [PATCH] * src/video_output/vout_subpictures.c: fixed a few race conditions that were triggered by the dvdplay plugin. --- src/video_output/vout_subpictures.c | 22 ++++++++++++++++++++-- 1 file changed, 20 insertions(+), 2 deletions(-) diff --git a/src/video_output/vout_subpictures.c b/src/video_output/vout_subpictures.c index 657e7cd032..51340885ab 100644 --- a/src/video_output/vout_subpictures.c +++ b/src/video_output/vout_subpictures.c @@ -2,7 +2,7 @@ * vout_subpictures.c : subpicture management functions ***************************************************************************** * Copyright (C) 2000 VideoLAN - * $Id: vout_subpictures.c,v 1.18 2002/11/20 13:37:36 sam Exp $ + * $Id: vout_subpictures.c,v 1.19 2003/01/30 12:38:13 gbazin Exp $ * * Authors: Vincent Seguin * Samuel Hocevar @@ -135,6 +135,16 @@ subpicture_t *vout_CreateSubPicture( vout_thread_t *p_vout, int i_type ) *****************************************************************************/ void vout_DestroySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) { + /* Get lock */ + vlc_mutex_lock( &p_vout->subpicture_lock ); + + /* There can be race conditions so we need to check the status */ + if( p_subpic->i_status == FREE_SUBPICTURE ) + { + vlc_mutex_unlock( &p_vout->subpicture_lock ); + return; + } + /* Check if status is valid */ if( ( p_subpic->i_status != RESERVED_SUBPICTURE ) && ( p_subpic->i_status != READY_SUBPICTURE ) ) @@ -149,6 +159,8 @@ void vout_DestroySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) } p_subpic->i_status = FREE_SUBPICTURE; + + vlc_mutex_unlock( &p_vout->subpicture_lock ); } /***************************************************************************** @@ -159,11 +171,17 @@ void vout_DestroySubPicture( vout_thread_t *p_vout, subpicture_t *p_subpic ) void vout_RenderSubPictures( vout_thread_t *p_vout, picture_t *p_pic, subpicture_t *p_subpic ) { - while( p_subpic != NULL ) + /* Get lock */ + vlc_mutex_lock( &p_vout->subpicture_lock ); + + /* Check i_status again to make sure spudec hasn't destroyed the subpic */ + while( p_subpic != NULL && p_subpic->i_status != FREE_SUBPICTURE ) { p_subpic->pf_render( p_vout, p_pic, p_subpic ); p_subpic = p_subpic->p_next; } + + vlc_mutex_unlock( &p_vout->subpicture_lock ); } /***************************************************************************** -- 2.39.5