summaryrefslogtreecommitdiffstats
path: root/Modules/posixmodule.c
diff options
context:
space:
mode:
authorGeorg Brandl <georg@python.org>2006-03-07 12:48:03 (GMT)
committerGeorg Brandl <georg@python.org>2006-03-07 12:48:03 (GMT)
commit622927b8502b0d638d52a65d6c03f4d822616b11 (patch)
tree7c08ea9b29b93c35b6fb1d3d81e7dade24777813 /Modules/posixmodule.c
parent725507b52ec40ab49ad87596fff7434322b9b5b1 (diff)
downloadcpython-622927b8502b0d638d52a65d6c03f4d822616b11.zip
cpython-622927b8502b0d638d52a65d6c03f4d822616b11.tar.gz
cpython-622927b8502b0d638d52a65d6c03f4d822616b11.tar.bz2
Bug #1432525: os.listdir now releases the GIL while calling
readdir().
Diffstat (limited to 'Modules/posixmodule.c')
-rw-r--r--Modules/posixmodule.c18
1 files changed, 15 insertions, 3 deletions
diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c
index ba1e6c0..3c28424 100644
--- a/Modules/posixmodule.c
+++ b/Modules/posixmodule.c
@@ -1640,6 +1640,7 @@ posix_listdir(PyObject *self, PyObject *args)
PyObject *d, *v;
HANDLE hFindFile;
+ BOOL result;
WIN32_FIND_DATA FileData;
/* MAX_PATH characters could mean a bigger encoded string */
char namebuf[MAX_PATH*2+5];
@@ -1692,7 +1693,10 @@ posix_listdir(PyObject *self, PyObject *args)
break;
}
Py_DECREF(v);
- } while (FindNextFileW(hFindFile, &wFileData) == TRUE);
+ Py_BEGIN_ALLOW_THREADS
+ result = FindNextFileW(hFindFile, &wFileData);
+ Py_END_ALLOW_THREADS
+ } while (result == TRUE);
if (FindClose(hFindFile) == FALSE) {
Py_DECREF(d);
@@ -1746,7 +1750,10 @@ posix_listdir(PyObject *self, PyObject *args)
break;
}
Py_DECREF(v);
- } while (FindNextFile(hFindFile, &FileData) == TRUE);
+ Py_BEGIN_ALLOW_THREADS
+ result = FindNextFile(hFindFile, &FileData);
+ Py_END_ALLOW_THREADS
+ } while (result == TRUE);
if (FindClose(hFindFile) == FALSE) {
Py_DECREF(d);
@@ -1848,7 +1855,12 @@ posix_listdir(PyObject *self, PyObject *args)
PyMem_Free(name);
return NULL;
}
- while ((ep = readdir(dirp)) != NULL) {
+ for (;;) {
+ Py_BEGIN_ALLOW_THREADS
+ ep = readdir(dirp);
+ Py_END_ALLOW_THREADS
+ if (ep == NULL)
+ break;
if (ep->d_name[0] == '.' &&
(NAMLEN(ep) == 1 ||
(ep->d_name[1] == '.' && NAMLEN(ep) == 2)))