diff options
author | Davide Rizzo <sorcio@gmail.com> | 2019-03-06 15:52:34 (GMT) |
---|---|---|
committer | Benjamin Peterson <benjamin@python.org> | 2019-03-06 15:52:34 (GMT) |
commit | bb9593af0ac835b93c2834d44b72fa34e30efed0 (patch) | |
tree | 91021065cc08f343d0055e9cd37ca644ec6b948d /Modules | |
parent | b71e28ea91259ca3914e2ff84fc126795ea6b848 (diff) | |
download | cpython-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.c | 39 |
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; |