summaryrefslogtreecommitdiffstats
path: root/Modules
diff options
context:
space:
mode:
authorDavide Rizzo <sorcio@gmail.com>2019-03-06 15:52:34 (GMT)
committerBenjamin Peterson <benjamin@python.org>2019-03-06 15:52:34 (GMT)
commitbb9593af0ac835b93c2834d44b72fa34e30efed0 (patch)
tree91021065cc08f343d0055e9cd37ca644ec6b948d /Modules
parentb71e28ea91259ca3914e2ff84fc126795ea6b848 (diff)
downloadcpython-bb9593af0ac835b93c2834d44b72fa34e30efed0.zip
cpython-bb9593af0ac835b93c2834d44b72fa34e30efed0.tar.gz
cpython-bb9593af0ac835b93c2834d44b72fa34e30efed0.tar.bz2
closes bpo-36139: release GIL around munmap(). (GH-12073)
Diffstat (limited to 'Modules')
-rw-r--r--Modules/mmapmodule.c39
1 files changed, 25 insertions, 14 deletions
diff --git a/Modules/mmapmodule.c b/Modules/mmapmodule.c
index f4caf87..326288c 100644
--- a/Modules/mmapmodule.c
+++ b/Modules/mmapmodule.c
@@ -117,6 +117,7 @@ typedef struct {
static void
mmap_object_dealloc(mmap_object *m_obj)
{
+ Py_BEGIN_ALLOW_THREADS
#ifdef MS_WINDOWS
if (m_obj->data != NULL)
UnmapViewOfFile (m_obj->data);
@@ -135,6 +136,7 @@ mmap_object_dealloc(mmap_object *m_obj)
munmap(m_obj->data, m_obj->size);
}
#endif /* UNIX */
+ Py_END_ALLOW_THREADS
if (m_obj->weakreflist != NULL)
PyObject_ClearWeakRefs((PyObject *) m_obj);
@@ -157,28 +159,37 @@ mmap_close_method(mmap_object *self, PyObject *unused)
again.
TODO - should we check for errors in the close operations???
*/
- if (self->data != NULL) {
- UnmapViewOfFile(self->data);
- self->data = NULL;
+ HANDLE map_handle = self->map_handle;
+ HANDLE file_handle = self->file_handle;
+ char *data = self->data;
+ self->map_handle = NULL;
+ self->file_handle = INVALID_HANDLE_VALUE;
+ self->data = NULL;
+ Py_BEGIN_ALLOW_THREADS
+ if (data != NULL) {
+ UnmapViewOfFile(data);
}
- if (self->map_handle != NULL) {
- CloseHandle(self->map_handle);
- self->map_handle = NULL;
+ if (map_handle != NULL) {
+ CloseHandle(map_handle);
}
- if (self->file_handle != INVALID_HANDLE_VALUE) {
- CloseHandle(self->file_handle);
- self->file_handle = INVALID_HANDLE_VALUE;
+ if (file_handle != INVALID_HANDLE_VALUE) {
+ CloseHandle(file_handle);
}
+ Py_END_ALLOW_THREADS
#endif /* MS_WINDOWS */
#ifdef UNIX
- if (0 <= self->fd)
- (void) close(self->fd);
+ int fd = self->fd;
+ char *data = self->data;
self->fd = -1;
- if (self->data != NULL) {
- munmap(self->data, self->size);
- self->data = NULL;
+ self->data = NULL;
+ Py_BEGIN_ALLOW_THREADS
+ if (0 <= fd)
+ (void) close(fd);
+ if (data != NULL) {
+ munmap(data, self->size);
}
+ Py_END_ALLOW_THREADS
#endif
Py_RETURN_NONE;