Protect the thread api calls in the _ctypes extension module within
#ifdef WITH_THREADS/#endif blocks. Found by Sam Rushing.
This commit is contained in:
parent
877fdb01fe
commit
bde081329b
|
@ -19,6 +19,9 @@ Core and builtins
|
|||
Library
|
||||
-------
|
||||
|
||||
- The '_ctypes' extension module now works when Python is configured
|
||||
with the --without-threads option.
|
||||
|
||||
- Bug #1504333: Make sgmllib support angle brackets in quoted
|
||||
attribute values.
|
||||
|
||||
|
|
|
@ -4555,7 +4555,9 @@ init_ctypes(void)
|
|||
ob_type is the metatype (the 'type'), defaults to PyType_Type,
|
||||
tp_base is the base type, defaults to 'object' aka PyBaseObject_Type.
|
||||
*/
|
||||
#ifdef WITH_THREADS
|
||||
PyEval_InitThreads();
|
||||
#endif
|
||||
m = Py_InitModule3("_ctypes", module_methods, module_docs);
|
||||
if (!m)
|
||||
return;
|
||||
|
|
|
@ -127,7 +127,9 @@ static void _CallPythonObject(void *mem,
|
|||
PyObject *result;
|
||||
PyObject *arglist = NULL;
|
||||
int nArgs;
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_STATE state = PyGILState_Ensure();
|
||||
#endif
|
||||
|
||||
nArgs = PySequence_Length(converters);
|
||||
/* Hm. What to return in case of error?
|
||||
|
@ -235,8 +237,9 @@ if (x == NULL) _AddTraceback(what, __FILE__, __LINE__ - 1), PyErr_Print()
|
|||
Py_XDECREF(result);
|
||||
Done:
|
||||
Py_XDECREF(arglist);
|
||||
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_Release(state);
|
||||
#endif
|
||||
}
|
||||
|
||||
static void closure_fcn(ffi_cif *cif,
|
||||
|
@ -397,12 +400,18 @@ STDAPI DllGetClassObject(REFCLSID rclsid,
|
|||
LPVOID *ppv)
|
||||
{
|
||||
long result;
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_STATE state;
|
||||
#endif
|
||||
|
||||
LoadPython();
|
||||
#ifdef WITH_THREADS
|
||||
state = PyGILState_Ensure();
|
||||
#endif
|
||||
result = Call_GetClassObject(rclsid, riid, ppv);
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_Release(state);
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
|
@ -454,9 +463,13 @@ long Call_CanUnloadNow(void)
|
|||
STDAPI DllCanUnloadNow(void)
|
||||
{
|
||||
long result;
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_STATE state = PyGILState_Ensure();
|
||||
#endif
|
||||
result = Call_CanUnloadNow();
|
||||
#ifdef WITH_THREADS
|
||||
PyGILState_Release(state);
|
||||
#endif
|
||||
return result;
|
||||
}
|
||||
|
||||
|
|
|
@ -617,7 +617,9 @@ static int _call_function_pointer(int flags,
|
|||
void *resmem,
|
||||
int argcount)
|
||||
{
|
||||
#ifdef WITH_THREADS
|
||||
PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */
|
||||
#endif
|
||||
ffi_cif cif;
|
||||
int cc;
|
||||
#ifdef MS_WIN32
|
||||
|
@ -649,8 +651,10 @@ static int _call_function_pointer(int flags,
|
|||
return -1;
|
||||
}
|
||||
|
||||
#ifdef WITH_THREADS
|
||||
if ((flags & FUNCFLAG_PYTHONAPI) == 0)
|
||||
Py_UNBLOCK_THREADS
|
||||
#endif
|
||||
#ifdef MS_WIN32
|
||||
#ifndef DONT_USE_SEH
|
||||
__try {
|
||||
|
@ -667,8 +671,10 @@ static int _call_function_pointer(int flags,
|
|||
}
|
||||
#endif
|
||||
#endif
|
||||
#ifdef WITH_THREADS
|
||||
if ((flags & FUNCFLAG_PYTHONAPI) == 0)
|
||||
Py_BLOCK_THREADS
|
||||
#endif
|
||||
#ifdef MS_WIN32
|
||||
#ifndef DONT_USE_SEH
|
||||
if (dwExceptionCode) {
|
||||
|
|
Loading…
Reference in New Issue