mirror of https://github.com/python/cpython.git
bpo-40882: Fix a memory leak in SharedMemory on Windows (GH-20684)
In multiprocessing.shared_memory.SharedMemory(), the temporary view
returned by MapViewOfFile() should be unmapped when it is no longer
needed.
(cherry picked from commit 85c128e34d
)
Co-authored-by: Zackery Spytz <zspytz@gmail.com>
This commit is contained in:
parent
64dae2efd5
commit
b027dd78bb
|
@ -173,7 +173,10 @@ def __init__(self, name=None, create=False, size=0):
|
|||
)
|
||||
finally:
|
||||
_winapi.CloseHandle(h_map)
|
||||
size = _winapi.VirtualQuerySize(p_buf)
|
||||
try:
|
||||
size = _winapi.VirtualQuerySize(p_buf)
|
||||
finally:
|
||||
_winapi.UnmapViewOfFile(p_buf)
|
||||
self._mmap = mmap.mmap(-1, size, tagname=name)
|
||||
|
||||
self._size = size
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
Fix a memory leak in :class:`multiprocessing.shared_memory.SharedMemory` on
|
||||
Windows.
|
|
@ -1402,6 +1402,30 @@ _winapi_MapViewOfFile_impl(PyObject *module, HANDLE file_map,
|
|||
return address;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
_winapi.UnmapViewOfFile
|
||||
|
||||
address: LPCVOID
|
||||
/
|
||||
[clinic start generated code]*/
|
||||
|
||||
static PyObject *
|
||||
_winapi_UnmapViewOfFile_impl(PyObject *module, LPCVOID address)
|
||||
/*[clinic end generated code: output=4f7e18ac75d19744 input=8c4b6119ad9288a3]*/
|
||||
{
|
||||
BOOL success;
|
||||
|
||||
Py_BEGIN_ALLOW_THREADS
|
||||
success = UnmapViewOfFile(address);
|
||||
Py_END_ALLOW_THREADS
|
||||
|
||||
if (!success) {
|
||||
return PyErr_SetFromWindowsErr(0);
|
||||
}
|
||||
|
||||
Py_RETURN_NONE;
|
||||
}
|
||||
|
||||
/*[clinic input]
|
||||
_winapi.OpenFileMapping -> HANDLE
|
||||
|
||||
|
@ -2095,6 +2119,7 @@ static PyMethodDef winapi_functions[] = {
|
|||
_WINAPI_READFILE_METHODDEF
|
||||
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
|
||||
_WINAPI_TERMINATEPROCESS_METHODDEF
|
||||
_WINAPI_UNMAPVIEWOFFILE_METHODDEF
|
||||
_WINAPI_VIRTUALQUERYSIZE_METHODDEF
|
||||
_WINAPI_WAITNAMEDPIPE_METHODDEF
|
||||
_WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF
|
||||
|
|
|
@ -731,6 +731,32 @@ exit:
|
|||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_winapi_UnmapViewOfFile__doc__,
|
||||
"UnmapViewOfFile($module, address, /)\n"
|
||||
"--\n"
|
||||
"\n");
|
||||
|
||||
#define _WINAPI_UNMAPVIEWOFFILE_METHODDEF \
|
||||
{"UnmapViewOfFile", (PyCFunction)_winapi_UnmapViewOfFile, METH_O, _winapi_UnmapViewOfFile__doc__},
|
||||
|
||||
static PyObject *
|
||||
_winapi_UnmapViewOfFile_impl(PyObject *module, LPCVOID address);
|
||||
|
||||
static PyObject *
|
||||
_winapi_UnmapViewOfFile(PyObject *module, PyObject *arg)
|
||||
{
|
||||
PyObject *return_value = NULL;
|
||||
LPCVOID address;
|
||||
|
||||
if (!PyArg_Parse(arg, "" F_POINTER ":UnmapViewOfFile", &address)) {
|
||||
goto exit;
|
||||
}
|
||||
return_value = _winapi_UnmapViewOfFile_impl(module, address);
|
||||
|
||||
exit:
|
||||
return return_value;
|
||||
}
|
||||
|
||||
PyDoc_STRVAR(_winapi_OpenFileMapping__doc__,
|
||||
"OpenFileMapping($module, desired_access, inherit_handle, name, /)\n"
|
||||
"--\n"
|
||||
|
@ -1216,4 +1242,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args
|
|||
exit:
|
||||
return return_value;
|
||||
}
|
||||
/*[clinic end generated code: output=d76d0a5901db2e2a input=a9049054013a1b77]*/
|
||||
/*[clinic end generated code: output=acabf8f2b5cc44a1 input=a9049054013a1b77]*/
|
||||
|
|
Loading…
Reference in New Issue