Commit bde08132 authored by Thomas Heller's avatar Thomas Heller

Protect the thread api calls in the _ctypes extension module within

#ifdef WITH_THREADS/#endif blocks.  Found by Sam Rushing.
parent 877fdb01
......@@ -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) {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment