In one case (noted by Erwan Tulou), this also fixes a large leak.
There is _absolutely_ no point in holding an object and releasing it
immediately. Holding an object only makes sense if:
- the object cannot vanish while calling vlc_object_hold(), and
- either:
- the object could have otherwise vanished before
vlc_object_release(), or
- there is no way to avoid the (otherwise not needed)
vlc_object_hold() because it comes from another component.
Conversely, it makes no sense to hold an object, if:
- it could vanish already while calling hold (race condition)
-> this is *invalid* and might crash,
- there is already a valid reference to the object throughout.
I don't know in which case that code was, but the popup menu definitely
does invalid object access in some cases. For instance:
- start playing a single video,
- seek to a few seconds before the end,
- open the popup menu, go to video / deinterlace,
- wait for the video to finish and the playlist to stop,
- click on "X" from the deinterlace submenu.
Oops.
}
p_input = THEMIM->getInput();
}
p_input = THEMIM->getInput();
- if( p_input )
- vlc_object_hold( p_input );
p_aout = THEMIM->getAout();
EnableStaticEntries( current, ( p_aout != NULL ) );
AudioAutoMenuBuilder( p_aout, p_input, objects, varnames );
p_aout = THEMIM->getAout();
EnableStaticEntries( current, ( p_aout != NULL ) );
AudioAutoMenuBuilder( p_aout, p_input, objects, varnames );
{
vlc_object_release( p_aout );
}
{
vlc_object_release( p_aout );
}
- if( p_input )
- vlc_object_release( p_input );
return Populate( p_intf, current, varnames, objects );
}
return Populate( p_intf, current, varnames, objects );
}
}
p_input = THEMIM->getInput();
}
p_input = THEMIM->getInput();
- if( p_input )
- vlc_object_hold( p_input );
p_vout = THEMIM->getVout();
VideoAutoMenuBuilder( p_vout, p_input, objects, varnames );
p_vout = THEMIM->getVout();
VideoAutoMenuBuilder( p_vout, p_input, objects, varnames );
if( p_vout )
vlc_object_release( p_vout );
if( p_vout )
vlc_object_release( p_vout );
- if( p_input )
- vlc_object_release( p_input );
-
return Populate( p_intf, current, varnames, objects );
}
return Populate( p_intf, current, varnames, objects );
}
/* Get the input and hold it */
p_object = THEMIM->getInput();
/* Get the input and hold it */
p_object = THEMIM->getInput();
- if( p_object )
- vlc_object_hold( p_object );
InputAutoMenuBuilder( p_object, objects, varnames );
InputAutoMenuBuilder( p_object, objects, varnames );
PUSH_VAR( "prev-chapter" );
PUSH_VAR( "next-chapter" );
PUSH_VAR( "prev-chapter" );
PUSH_VAR( "next-chapter" );
- if( p_object )
- vlc_object_release( p_object );
-
EnableStaticEntries( menu, (p_object != NULL ) );
return Populate( p_intf, menu, varnames, objects );
}
EnableStaticEntries( menu, (p_object != NULL ) );
return Populate( p_intf, menu, varnames, objects );
}
POPUP_BOILERPLATE;
if( p_input )
{
POPUP_BOILERPLATE;
if( p_input )
{
- vlc_object_hold( p_input );
vout_thread_t *p_vout = THEMIM->getVout();
if( p_vout )
{
VideoAutoMenuBuilder( p_vout, p_input, objects, varnames );
vlc_object_release( p_vout );
}
vout_thread_t *p_vout = THEMIM->getVout();
if( p_vout )
{
VideoAutoMenuBuilder( p_vout, p_input, objects, varnames );
vlc_object_release( p_vout );
}
- vlc_object_release( p_input );
}
QMenu *menu = new QMenu();
CREATE_POPUP;
}
QMenu *menu = new QMenu();
CREATE_POPUP;
POPUP_BOILERPLATE;
if( p_input )
{
POPUP_BOILERPLATE;
if( p_input )
{
- vlc_object_hold( p_input );
aout_instance_t *p_aout = THEMIM->getAout();
AudioAutoMenuBuilder( p_aout, p_input, objects, varnames );
if( p_aout )
vlc_object_release( p_aout );
aout_instance_t *p_aout = THEMIM->getAout();
AudioAutoMenuBuilder( p_aout, p_input, objects, varnames );
if( p_aout )
vlc_object_release( p_aout );
- vlc_object_release( p_input );
}
QMenu *menu = new QMenu();
CREATE_POPUP;
}
QMenu *menu = new QMenu();
CREATE_POPUP;
- vlc_object_hold( p_input );
varnames.push_back( "audio-es" );
InputAutoMenuBuilder( p_input, objects, varnames );
PUSH_SEPARATOR;
varnames.push_back( "audio-es" );
InputAutoMenuBuilder( p_input, objects, varnames );
PUSH_SEPARATOR;
- vlc_object_hold( p_input );
InputAutoMenuBuilder( p_input, objects, varnames );
InputAutoMenuBuilder( p_input, objects, varnames );
- vlc_object_release( p_input );
/* Audio menu */
submenu = new QMenu( menu );
/* Audio menu */
submenu = new QMenu( menu );