[vlc-devel] Latest build crashes under Windows on exit

Pierre d'Herbemont pdherbemont at free.fr
Sat May 17 12:43:32 CEST 2008


Hi Rémi,

On May 17, 2008, at 10:23 AM, Rémi Denis-Courmont wrote:

> Le Friday 16 May 2008 21:35:12 jboileau, vous avez écrit :
>> I don't know if issue this is known. The latest build crashes on exit
>> under Windows with the message 'Runtime Error!'. If this a known  
>> issue
>> disregard this email, it is to be expected in the middle of
>> development. If it is not known, I can enter a ticket if needed.
>>
>> There isn't anything special to do. Just starting VLC and closing it
>> without any other operation will crash.
>
> This should work around the problem (works for me). But I currently  
> believe
> that this is working around a bug rather than actually fixing it.

I think this is fine.

Yet, I kind of prefer the solution where we track if they are  
remaining children attached to the object we release.

For that we must *not* set the p_parent members of the p_children to  
NULL before calling the object destructor, hence each child can call  
vlc_object_detach() on itself.

As funman would appreciate, here, is a simple ASCII art of what we are  
trying to achieve:

p_obj
	p_child1
	p_child2

vlc_object_release( p_obj )
	vlc_object_destroy()
		p_obj->pf_destructor()
			vlc_object_release( p_obj->p_child1 )
				vlc_object_detach( p_obj->p_child1 ) (non no-op version)...
			vlc_object_release( p_obj->p_child2 )
				vlc_object_detach( p_obj->p_child2 ) (non no-op version)...
		// Now we can track child leak

However, we are encountering the following:
if *prior* to calling p_child->pf_destructor, something like  
vlc_find_object( p_child, FIND_PARENT ) is called (from an other  
thread then), p_child->p_parent->i_refcount is 0. We may yield it, and  
then assert() and fail.

One idea, is to support in vlc_find_object() refcount set to zero (in  
fact only for FIND_PARENT, because object get's atomatically detached  
when their refcount reaches 0).

We have to remember that we won't be using freed pointer objects, as  
before freeing() the useful part of the vlc_object_t, we do check if  
*no children* are remaining, and we never free( p_obj ) in that cases.  
So in regular uses, there shouldn't be any freed pointer uses.

An other idea, is to make sure that no objects uses FIND_PARENT... But  
I am not sure that's that easy.

Pierre.


More information about the vlc-devel mailing list