diff options
-rw-r--r-- | Misc/NEWS | 3 | ||||
-rw-r--r-- | Modules/_ctypes/_ctypes.c | 2 | ||||
-rw-r--r-- | Modules/_ctypes/callbacks.c | 15 | ||||
-rw-r--r-- | Modules/_ctypes/callproc.c | 6 |
4 files changed, 25 insertions, 1 deletions
@@ -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 4b07591..a36166d 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 b4f09e0..9d08f1a 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 c229106..a084f81 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) { |