Commit 920e215b authored by Olivier Aubert's avatar Olivier Aubert

embedded snapshot: guard against spurious vlc_object_wait wakeups.

Thanks courmisch for noticing this.
It still uses the old, and soon to be deprecated I imagine, vlc_object_wait API, but well, we cannot go faster than the music, can we?
parent 32c21f40
...@@ -88,9 +88,18 @@ mediacontrol_snapshot( mediacontrol_Instance *self, ...@@ -88,9 +88,18 @@ mediacontrol_snapshot( mediacontrol_Instance *self,
var_SetString( p_vout, "snapshot-path", path ); var_SetString( p_vout, "snapshot-path", path );
var_SetString( p_vout, "snapshot-format", "png" ); var_SetString( p_vout, "snapshot-format", "png" );
vlc_object_lock( p_cache ); vlc_object_lock( p_cache );
/* Initialize p_cache->p_private with p_cache own value, to be
used as a sentinel against spurious vlc_object_wait wakeups.
If a legitimate wakeup occurs, then p_cache->p_private will hold either
NULL (in case of error) or a pointer to a p_snapshot data structure.
*/
p_cache->p_private = p_cache;
vout_Control( p_vout, VOUT_SNAPSHOT ); vout_Control( p_vout, VOUT_SNAPSHOT );
vlc_object_wait( p_cache ); while ( p_cache->p_private == p_cache )
vlc_object_wait( p_cache );
vlc_object_release( p_vout ); vlc_object_release( p_vout );
p_snapshot = ( snapshot_t* ) p_cache->p_private; p_snapshot = ( snapshot_t* ) p_cache->p_private;
......
...@@ -632,16 +632,17 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -632,16 +632,17 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
snapshot_t *p_snapshot; snapshot_t *p_snapshot;
size_t i_size; size_t i_size;
/* Object must be locked. We will unlock it once we get the /* Object must be locked by the caller function. We will
snapshot and written it to p_private */ unlock it once we get the snapshot and have written it to
p_dest->p_private = NULL; p_cache->p_private. */
/* Save the snapshot to a memory zone */ /* Save the snapshot to a memory zone */
p_block = image_Write( p_image, p_pic, &fmt_in, &fmt_out ); p_block = image_Write( p_image, p_pic, &fmt_in, &fmt_out );
if( !p_block ) if( !p_block )
{ {
msg_Err( p_vout, "Could not get snapshot" ); msg_Err( p_vout, "Could not get snapshot" );
image_HandlerDelete( p_image ); image_HandlerDelete( p_image );
p_dest->p_private = NULL;
vlc_object_signal_unlocked( p_dest ); vlc_object_signal_unlocked( p_dest );
vlc_object_release( p_dest ); vlc_object_release( p_dest );
return VLC_EGENERIC; return VLC_EGENERIC;
...@@ -654,6 +655,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -654,6 +655,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
{ {
block_Release( p_block ); block_Release( p_block );
image_HandlerDelete( p_image ); image_HandlerDelete( p_image );
p_dest->p_private = NULL;
vlc_object_signal_unlocked( p_dest ); vlc_object_signal_unlocked( p_dest );
vlc_object_release( p_dest ); vlc_object_release( p_dest );
return VLC_ENOMEM; return VLC_ENOMEM;
...@@ -671,6 +673,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic ) ...@@ -671,6 +673,7 @@ int vout_Snapshot( vout_thread_t *p_vout, picture_t *p_pic )
block_Release( p_block ); block_Release( p_block );
free( p_snapshot ); free( p_snapshot );
image_HandlerDelete( p_image ); image_HandlerDelete( p_image );
p_dest->p_private = NULL;
vlc_object_signal_unlocked( p_dest ); vlc_object_signal_unlocked( p_dest );
vlc_object_release( p_dest ); vlc_object_release( p_dest );
return VLC_ENOMEM; return VLC_ENOMEM;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment