From: Antoine Pitrou Date: Mon, 9 Aug 2010 23:39:31 +0000 (+0000) Subject: Issue #6915: Under Windows, os.listdir() didn't release the Global X-Git-Tag: v3.2a2~381 X-Git-Url: http://git.ipfire.org/gitweb.cgi?a=commitdiff_plain;h=b73caab4362e38e4a55af6a04fe0740b3c67cf69;p=thirdparty%2FPython%2Fcpython.git Issue #6915: Under Windows, os.listdir() didn't release the Global Interpreter Lock around all system calls. Original patch by Ryan Kelly. --- diff --git a/Misc/ACKS b/Misc/ACKS index 41d314e19642..6f689adce895 100644 --- a/Misc/ACKS +++ b/Misc/ACKS @@ -419,6 +419,7 @@ Jacob Kaplan-Moss Lou Kates Hiroaki Kawai Sebastien Keim +Ryan Kelly Robert Kern Randall Kern Magnus Kessler diff --git a/Misc/NEWS b/Misc/NEWS index ef35ddcd690e..b89f89d1ce46 100644 --- a/Misc/NEWS +++ b/Misc/NEWS @@ -30,6 +30,9 @@ Core and Builtins Extensions ---------- +- Issue #6915: Under Windows, os.listdir() didn't release the Global + Interpreter Lock around all system calls. Original patch by Ryan Kelly. + - Issue #8524: Add a detach() method to socket objects, so as to put the socket into the closed state without closing the underlying file descriptor. diff --git a/Modules/posixmodule.c b/Modules/posixmodule.c index 0b14f5cc22b3..449093a7fc85 100644 --- a/Modules/posixmodule.c +++ b/Modules/posixmodule.c @@ -1229,7 +1229,7 @@ win32_stat_w(const wchar_t* path, struct win32_stat *result) /* FILE_FLAG_BACKUP_SEMANTICS is required to open a directory */ FILE_ATTRIBUTE_NORMAL|FILE_FLAG_BACKUP_SEMANTICS, NULL); - + if(hFile == INVALID_HANDLE_VALUE) { /* Either the target doesn't exist, or we don't have access to get a handle to it. If the former, we need to return an error. @@ -2353,7 +2353,9 @@ posix_listdir(PyObject *self, PyObject *args) free(wnamebuf); return NULL; } + Py_BEGIN_ALLOW_THREADS hFindFile = FindFirstFileW(wnamebuf, &wFileData); + Py_END_ALLOW_THREADS if (hFindFile == INVALID_HANDLE_VALUE) { int error = GetLastError(); if (error == ERROR_FILE_NOT_FOUND) { @@ -2430,7 +2432,9 @@ posix_listdir(PyObject *self, PyObject *args) if ((d = PyList_New(0)) == NULL) return NULL; + Py_BEGIN_ALLOW_THREADS hFindFile = FindFirstFile(namebuf, &FileData); + Py_END_ALLOW_THREADS if (hFindFile == INVALID_HANDLE_VALUE) { int error = GetLastError(); if (error == ERROR_FILE_NOT_FOUND)