[vtk-developers] Gil tests on megas

David Gobbi david.gobbi at gmail.com
Wed Nov 18 15:49:06 EST 2015


Oops!  Thanks for finding this.  I can cherry-pick your (pending) fix to
my python-py3k branch for VTK 6.3.

 - David


On Wed, Nov 18, 2015 at 1:34 PM, Ben Boeckel <ben.boeckel at kitware.com>
wrote:

> On Tue, Nov 17, 2015 at 12:53:09 +0100, Mathieu Westphal wrote:
> > I'm testing my GIl ensured version of VTK (
> > https://gitlab.kitware.com/vtk/vtk/merge_requests/582) with the
> buildbots,
> > and i have only three problematic recurring tests, on a specific build of
> > megas.
>
> Found it. Here's the code from PyVTKObject_FromPointer:
>
> >   const char *classname = vtkPythonUtil::StripModule(pytype->tp_name);
>
> ...
>
> >     // Use the vtkname of the supplied class type
> >     PyObject *s = PyObject_GetAttrString((PyObject *)pytype,
> "__vtkname__");
> >     if (s)
> >       {
> > #ifdef VTK_PY3K
> >       PyObject *tmp = PyUnicode_AsUTF8String(s);
>
> Python3 uses unicode objects, but we need ASCII...
>
> >       if (tmp)
> >         {
> >         Py_DECREF(s);
> >         s = tmp;
>
> ...so `s` is now a new bytes object...
>
> >         }
> > #endif
> >       classname = PyBytes_AsString(s);
>
> ...we take a pointer to its data for use later...
>
> >       if (classname == 0)
> >         {
> >         Py_DECREF(s);
> >         return NULL;
> >         }
> >       }
> >     cls = vtkPythonUtil::FindClass(classname);
> >     if (cls == 0)
> >       {
> >       PyErr_Format(PyExc_ValueError,
> >                    "internal error, unknown VTK class %.200s",
> >                    classname);
> >       Py_XDECREF(s);
> >       return NULL;
> >       }
> >     Py_XDECREF(s);
>
> ...decref the bytes object here (which can now be garbage collected)...
>
> >     }
> >
> >   if (!ptr)
> >     {
> >     // Create a new instance of this class since we were not given one.
> >     if (cls->vtk_new)
> >       {
> >       ptr = cls->vtk_new();
> >       if (!ptr)
> >         {
> >         // The vtk_new() method returns null when a factory class has no
> >         // implementation (i.e. cannot provide a concrete class
> instance.)
> >         // NotImplementedError indicates a pure virtual method call.
> >         PyErr_SetString(
> >           PyExc_NotImplementedError,
> >           "no concrete implementation exists for this class");
> >         return 0;
> >         }
> >       created = true;
> >
> >       // Check the type of the newly-created object
> >       const char *newclassname = ptr->GetClassName();
> >       if (strcmp(newclassname, classname) != 0)
>
> ...and use the pointer to the old object's data here.
>
> It only crashes in Python3 and when the garbage collector runs between
> the Py_XDECREF above and its use here. The test fails because glibc
> catches the bogus pointer after free() does its thing, so that's why
> only megas caught it.
>
> Branch incoming :) .
>
> --Ben
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://public.kitware.com/pipermail/vtk-developers/attachments/20151118/e6c0373a/attachment.html>


More information about the vtk-developers mailing list