Bug #1432525: os.listdir now releases the GIL while calling

readdir().
This commit is contained in:
Georg Brandl 2006-03-07 12:48:03 +00:00
parent 725507b52e
commit 622927b850
1 changed files with 15 additions and 3 deletions

View File

@ -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)))