<div dir="ltr"><div>I wasn't able to reproduce the issue, but I think that I found out what causes it.  When vtkPythonCommand::Execute() is called, it tries to promote the subject object (i.e. the object being deleted for DeleteEvent) into a Python object.  I was able to confirm that this actually happens, and even though I couldn't get it to crash, I'm pretty sure that it puts the program into a bad state.</div><div><br></div><div>See <a href="https://gitlab.kitware.com/vtk/vtk/merge_requests/2131">https://gitlab.kitware.com/vtk/vtk/merge_requests/2131</a></div><div class="gmail_extra"><br></div><div class="gmail_extra"> - David</div><div class="gmail_extra"><br><div class="gmail_quote">On Tue, Nov 1, 2016 at 9:19 AM, Utkarsh Ayachit <span dir="ltr"><<a href="mailto:utkarsh.ayachit@kitware.com" target="_blank">utkarsh.ayachit@kitware.com</a>></span> wrote:<br><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex">Ken,<br>
<br>
The issue seems to be that the callback is attempted to be called for<br>
vtkCommand::DeleteEvent since the observer is set to respond to<br>
"AnyEvent".  When the object is being cleaned up as part of the<br>
interpreter being destroyed, calling Python commands is indeed<br>
problematic and hence the failure.<br>
<br>
The test can be fixed by changing the observer to only listen to<br>
ModifiedEvent instead of AnyEvent. Ideally vtkPythonCommand::Execute<br>
can check if the interpreter is being cleaned up, but I am not sure<br>
how to do that.<br>
<br>
Utkarsh<br>
<div><div class="h5"><br>
On Tue, Nov 1, 2016 at 10:33 AM, Ken Martin <<a href="mailto:ken.martin@kitware.com">ken.martin@kitware.com</a>> wrote:<br>
> OK here is a puzzle. We have a test that is occasionally failing and I<br>
> suspect it fails due to random python order of deletion of vtk objects. The<br>
> relevant python code is below. It fails when unregistering a vtkObject and I<br>
> suspect it is failing when invoking an callback during the<br>
> unregisterinternal method see the stack trace. So maybe python has deleted<br>
> the object from its maps but then it gets used in a callback for another<br>
> object being deleted? Again my python foo is weak but maybe we have to<br>
> unregister the anyEvent observer before the end of the script? Maybe<br>
> something else?<br>
><br>
>     @vtk.calldata_type(vtk.VTK_<wbr>OBJECT)<br>
>     def callbackObj(self, caller, event, calldata):<br>
>         self.calldata = calldata<br>
><br>
>     def setUp(self):<br>
>         self.vtkObj = vtk.vtkObject()<br>
><br>
>         self.vtkObjForCallData = vtk.vtkObject()<br>
><br>
>     def test_obj(self):<br>
>         self.vtkObj.AddObserver(vtk.<wbr>vtkCommand.AnyEvent, self.callbackObj)<br>
>         self.vtkObj.InvokeEvent(vtk.<wbr>vtkCommand.ModifiedEvent,<br>
> self.vtkObjForCallData)<br>
>         self.assertEqual(self.<wbr>calldata, self.vtkObjForCallData)<br>
><br>
> 0x7f98bd3e8770 : ??? [(???) ???:-1]<br>
> 0x7f98bd19b778 : vtkPythonCommand::Execute(<wbr>vtkObject*, unsigned long, void*)<br>
> [(libvtkWrappingPython35Core-<wbr>7.1.so.1) ???:-1]<br>
> 0x7f98bcb9fd7e : ??? [(???) ???:-1]<br>
> 0x7f98bcba000c : vtkObject::UnRegisterInternal(<wbr>vtkObjectBase*, int)<br>
> [(libvtkCommonCore-7.1.so.1) ???:-1]<br>
> 0x7f98bd19f045 : vtkPythonUtil::<wbr>RemoveObjectFromMap(_object*)<br>
> [(libvtkWrappingPython35Core-<wbr>7.1.so.1) ???:-1]<br>
> 0x7f98bd1a5b30 : PyVTKObject_Delete [(libvtkWrappingPython35Core-<wbr>7.1.so.1)<br>
> ???:-1]<br></div></div></blockquote></div></div></div>