From bde081329bbf658be0267b067c61341e0a4a74b8 Mon Sep 17 00:00:00 2001 From: Thomas Heller Date: Thu, 29 Jun 2006 18:34:15 +0000 Subject: [PATCH] Protect the thread api calls in the _ctypes extension module within #ifdef WITH_THREADS/#endif blocks. Found by Sam Rushing. --- Misc/NEWS | 3 +++ Modules/_ctypes/_ctypes.c | 2 ++ Modules/_ctypes/callbacks.c | 15 ++++++++++++++- Modules/_ctypes/callproc.c | 6 ++++++ 4 files changed, 25 insertions(+), 1 deletion(-) diff --git a/Misc/NEWS b/Misc/NEWS index 8e83867b3c..2b3a8df005 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -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. diff --git a/Modules/_ctypes/_ctypes.c b/Modules/_ctypes/_ctypes.c index 4b07591307..a36166db71 100644 --- a/Modules/_ctypes/_ctypes.c +++ b/Modules/_ctypes/_ctypes.c @@ -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; diff --git a/Modules/_ctypes/callbacks.c b/Modules/_ctypes/callbacks.c index b4f09e0361..9d08f1a3dc 100644 --- a/Modules/_ctypes/callbacks.c +++ b/Modules/_ctypes/callbacks.c @@ -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; } diff --git a/Modules/_ctypes/callproc.c b/Modules/_ctypes/callproc.c index c229106c7a..a084f812f6 100644 --- a/Modules/_ctypes/callproc.c +++ b/Modules/_ctypes/callproc.c @@ -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) { -- 2.40.0