mirror of https://github.com/python/cpython.git
closes bpo-36139: release GIL around munmap(). (GH-12073)
This commit is contained in:
parent
b71e28ea91
commit
bb9593af0a
|
@ -0,0 +1 @@
|
||||||
|
Release GIL when closing :class:`~mmap.mmap` objects.
|
|
@ -117,6 +117,7 @@ typedef struct {
|
||||||
static void
|
static void
|
||||||
mmap_object_dealloc(mmap_object *m_obj)
|
mmap_object_dealloc(mmap_object *m_obj)
|
||||||
{
|
{
|
||||||
|
Py_BEGIN_ALLOW_THREADS
|
||||||
#ifdef MS_WINDOWS
|
#ifdef MS_WINDOWS
|
||||||
if (m_obj->data != NULL)
|
if (m_obj->data != NULL)
|
||||||
UnmapViewOfFile (m_obj->data);
|
UnmapViewOfFile (m_obj->data);
|
||||||
|
@ -135,6 +136,7 @@ mmap_object_dealloc(mmap_object *m_obj)
|
||||||
munmap(m_obj->data, m_obj->size);
|
munmap(m_obj->data, m_obj->size);
|
||||||
}
|
}
|
||||||
#endif /* UNIX */
|
#endif /* UNIX */
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
|
|
||||||
if (m_obj->weakreflist != NULL)
|
if (m_obj->weakreflist != NULL)
|
||||||
PyObject_ClearWeakRefs((PyObject *) m_obj);
|
PyObject_ClearWeakRefs((PyObject *) m_obj);
|
||||||
|
@ -157,28 +159,37 @@ mmap_close_method(mmap_object *self, PyObject *unused)
|
||||||
again.
|
again.
|
||||||
TODO - should we check for errors in the close operations???
|
TODO - should we check for errors in the close operations???
|
||||||
*/
|
*/
|
||||||
if (self->data != NULL) {
|
HANDLE map_handle = self->map_handle;
|
||||||
UnmapViewOfFile(self->data);
|
HANDLE file_handle = self->file_handle;
|
||||||
self->data = NULL;
|
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) {
|
if (map_handle != NULL) {
|
||||||
CloseHandle(self->map_handle);
|
CloseHandle(map_handle);
|
||||||
self->map_handle = NULL;
|
|
||||||
}
|
}
|
||||||
if (self->file_handle != INVALID_HANDLE_VALUE) {
|
if (file_handle != INVALID_HANDLE_VALUE) {
|
||||||
CloseHandle(self->file_handle);
|
CloseHandle(file_handle);
|
||||||
self->file_handle = INVALID_HANDLE_VALUE;
|
|
||||||
}
|
}
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
#endif /* MS_WINDOWS */
|
#endif /* MS_WINDOWS */
|
||||||
|
|
||||||
#ifdef UNIX
|
#ifdef UNIX
|
||||||
if (0 <= self->fd)
|
int fd = self->fd;
|
||||||
(void) close(self->fd);
|
char *data = self->data;
|
||||||
self->fd = -1;
|
self->fd = -1;
|
||||||
if (self->data != NULL) {
|
self->data = NULL;
|
||||||
munmap(self->data, self->size);
|
Py_BEGIN_ALLOW_THREADS
|
||||||
self->data = NULL;
|
if (0 <= fd)
|
||||||
|
(void) close(fd);
|
||||||
|
if (data != NULL) {
|
||||||
|
munmap(data, self->size);
|
||||||
}
|
}
|
||||||
|
Py_END_ALLOW_THREADS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
Py_RETURN_NONE;
|
Py_RETURN_NONE;
|
||||||
|
|
Loading…
Reference in New Issue