Add a bunch of GIL release/acquire points in tp_print implementations and for
PyObject_Print().
Closes issue #1164.
diff --git a/Modules/_collectionsmodule.c b/Modules/_collectionsmodule.c
index 7f5e2ae..ea68f80 100644
--- a/Modules/_collectionsmodule.c
+++ b/Modules/_collectionsmodule.c
@@ -652,7 +652,9 @@
if (i != 0) {
if (i < 0)
return i;
+ Py_BEGIN_ALLOW_THREADS
fputs("[...]", fp);
+ Py_END_ALLOW_THREADS
return 0;
}
@@ -660,9 +662,13 @@
if (it == NULL)
return -1;
+ Py_BEGIN_ALLOW_THREADS
fputs("deque([", fp);
+ Py_END_ALLOW_THREADS
while ((item = PyIter_Next(it)) != NULL) {
+ Py_BEGIN_ALLOW_THREADS
fputs(emit, fp);
+ Py_END_ALLOW_THREADS
emit = separator;
if (PyObject_Print(item, fp, 0) != 0) {
Py_DECREF(item);
@@ -676,7 +682,9 @@
Py_DECREF(it);
if (PyErr_Occurred())
return -1;
+ Py_BEGIN_ALLOW_THREADS
fputs("])", fp);
+ Py_END_ALLOW_THREADS
return 0;
}
@@ -1190,15 +1198,24 @@
defdict_print(defdictobject *dd, FILE *fp, int flags)
{
int sts;
+ Py_BEGIN_ALLOW_THREADS
fprintf(fp, "defaultdict(");
- if (dd->default_factory == NULL)
+ Py_END_ALLOW_THREADS
+ if (dd->default_factory == NULL) {
+ Py_BEGIN_ALLOW_THREADS
fprintf(fp, "None");
+ Py_END_ALLOW_THREADS
+ }
else {
PyObject_Print(dd->default_factory, fp, 0);
}
+ Py_BEGIN_ALLOW_THREADS
fprintf(fp, ", ");
+ Py_END_ALLOW_THREADS
sts = PyDict_Type.tp_print((PyObject *)dd, fp, 0);
+ Py_BEGIN_ALLOW_THREADS
fprintf(fp, ")");
+ Py_END_ALLOW_THREADS
return sts;
}