diff options
author | Georg Brandl <georg@python.org> | 2006-03-07 12:48:03 (GMT) |
---|---|---|
committer | Georg Brandl <georg@python.org> | 2006-03-07 12:48:03 (GMT) |
commit | 622927b8502b0d638d52a65d6c03f4d822616b11 (patch) | |
tree | 7c08ea9b29b93c35b6fb1d3d81e7dade24777813 /Modules/posixmodule.c | |
parent | 725507b52ec40ab49ad87596fff7434322b9b5b1 (diff) | |
download | cpython-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.c | 18 |
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))) |