> So one your thread has acquired the GIL, one of 3 things happens:
> 
> * It returns quickly and the GIL is released.
> * It executes many many instructions: every 'n' instructions Python will 
> temporarily release the GIL for you.
> * It calls some other blocking function.  This other blocking function 
> must release the GIL before blocking, then re-aquire it when it needs to 
> re-enter Python.

You're gonna love this one, Mark. It's number 3, and it's *pywin32* May I
present exhibit A:

PyObject *PyITypeInfo::GetContainingTypeLib()
{
        ITypeInfo *pMyTypeInfo = GetI(this);
        if (pMyTypeInfo==NULL) return NULL;

        ITypeLib *ptlib;
        unsigned index;
        SCODE sc = pMyTypeInfo->GetContainingTypeLib(&ptlib, &index);
        if (FAILED(sc))
                return PyCom_BuildPyException(sc, pMyTypeInfo, IID_ITypeInfo);

        PyObject *ret = PyTuple_New(2);
        PyTuple_SetItem(ret, 0, PyCom_PyObjectFromIUnknown(ptlib, 
IID_ITypeLib));
        PyTuple_SetItem(ret, 1, PyInt_FromLong(index));
        return ret;
}

Unremarkable until you notice the call into GetContainingTypeLib is not wrapped
in PY_INTERFACE_PRECALL and PY_INTERFACE_POSTCALL. I'll add those lines in and
make sure my problem is fixed. I think we have a bug.


_______________________________________________
python-win32 mailing list
python-win32@python.org
http://mail.python.org/mailman/listinfo/python-win32

Reply via email to