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 ...@@ -19,6 +19,9 @@ Core and builtins
Library 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 - Bug #1504333: Make sgmllib support angle brackets in quoted
attribute values. attribute values.
......
...@@ -4555,7 +4555,9 @@ init_ctypes(void) ...@@ -4555,7 +4555,9 @@ init_ctypes(void)
ob_type is the metatype (the 'type'), defaults to PyType_Type, ob_type is the metatype (the 'type'), defaults to PyType_Type,
tp_base is the base type, defaults to 'object' aka PyBaseObject_Type. tp_base is the base type, defaults to 'object' aka PyBaseObject_Type.
*/ */
#ifdef WITH_THREADS
PyEval_InitThreads(); PyEval_InitThreads();
#endif
m = Py_InitModule3("_ctypes", module_methods, module_docs); m = Py_InitModule3("_ctypes", module_methods, module_docs);
if (!m) if (!m)
return; return;
......
...@@ -127,7 +127,9 @@ static void _CallPythonObject(void *mem, ...@@ -127,7 +127,9 @@ static void _CallPythonObject(void *mem,
PyObject *result; PyObject *result;
PyObject *arglist = NULL; PyObject *arglist = NULL;
int nArgs; int nArgs;
#ifdef WITH_THREADS
PyGILState_STATE state = PyGILState_Ensure(); PyGILState_STATE state = PyGILState_Ensure();
#endif
nArgs = PySequence_Length(converters); nArgs = PySequence_Length(converters);
/* Hm. What to return in case of error? /* Hm. What to return in case of error?
...@@ -235,8 +237,9 @@ if (x == NULL) _AddTraceback(what, __FILE__, __LINE__ - 1), PyErr_Print() ...@@ -235,8 +237,9 @@ if (x == NULL) _AddTraceback(what, __FILE__, __LINE__ - 1), PyErr_Print()
Py_XDECREF(result); Py_XDECREF(result);
Done: Done:
Py_XDECREF(arglist); Py_XDECREF(arglist);
#ifdef WITH_THREADS
PyGILState_Release(state); PyGILState_Release(state);
#endif
} }
static void closure_fcn(ffi_cif *cif, static void closure_fcn(ffi_cif *cif,
...@@ -397,12 +400,18 @@ STDAPI DllGetClassObject(REFCLSID rclsid, ...@@ -397,12 +400,18 @@ STDAPI DllGetClassObject(REFCLSID rclsid,
LPVOID *ppv) LPVOID *ppv)
{ {
long result; long result;
#ifdef WITH_THREADS
PyGILState_STATE state; PyGILState_STATE state;
#endif
LoadPython(); LoadPython();
#ifdef WITH_THREADS
state = PyGILState_Ensure(); state = PyGILState_Ensure();
#endif
result = Call_GetClassObject(rclsid, riid, ppv); result = Call_GetClassObject(rclsid, riid, ppv);
#ifdef WITH_THREADS
PyGILState_Release(state); PyGILState_Release(state);
#endif
return result; return result;
} }
...@@ -454,9 +463,13 @@ long Call_CanUnloadNow(void) ...@@ -454,9 +463,13 @@ long Call_CanUnloadNow(void)
STDAPI DllCanUnloadNow(void) STDAPI DllCanUnloadNow(void)
{ {
long result; long result;
#ifdef WITH_THREADS
PyGILState_STATE state = PyGILState_Ensure(); PyGILState_STATE state = PyGILState_Ensure();
#endif
result = Call_CanUnloadNow(); result = Call_CanUnloadNow();
#ifdef WITH_THREADS
PyGILState_Release(state); PyGILState_Release(state);
#endif
return result; return result;
} }
......
...@@ -617,7 +617,9 @@ static int _call_function_pointer(int flags, ...@@ -617,7 +617,9 @@ static int _call_function_pointer(int flags,
void *resmem, void *resmem,
int argcount) int argcount)
{ {
#ifdef WITH_THREADS
PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */ PyThreadState *_save = NULL; /* For Py_BLOCK_THREADS and Py_UNBLOCK_THREADS */
#endif
ffi_cif cif; ffi_cif cif;
int cc; int cc;
#ifdef MS_WIN32 #ifdef MS_WIN32
...@@ -649,8 +651,10 @@ static int _call_function_pointer(int flags, ...@@ -649,8 +651,10 @@ static int _call_function_pointer(int flags,
return -1; return -1;
} }
#ifdef WITH_THREADS
if ((flags & FUNCFLAG_PYTHONAPI) == 0) if ((flags & FUNCFLAG_PYTHONAPI) == 0)
Py_UNBLOCK_THREADS Py_UNBLOCK_THREADS
#endif
#ifdef MS_WIN32 #ifdef MS_WIN32
#ifndef DONT_USE_SEH #ifndef DONT_USE_SEH
__try { __try {
...@@ -667,8 +671,10 @@ static int _call_function_pointer(int flags, ...@@ -667,8 +671,10 @@ static int _call_function_pointer(int flags,
} }
#endif #endif
#endif #endif
#ifdef WITH_THREADS
if ((flags & FUNCFLAG_PYTHONAPI) == 0) if ((flags & FUNCFLAG_PYTHONAPI) == 0)
Py_BLOCK_THREADS Py_BLOCK_THREADS
#endif
#ifdef MS_WIN32 #ifdef MS_WIN32
#ifndef DONT_USE_SEH #ifndef DONT_USE_SEH
if (dwExceptionCode) { 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