mirror of https://github.com/python/cpython
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.
This commit is contained in:
parent
8749121b07
commit
85c128e34d
|
@ -173,7 +173,10 @@ class SharedMemory:
|
|||
)
|
||||
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.
|
|
@ -1393,6 +1393,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
|
||||
|
||||
|
@ -2062,6 +2086,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
|
||||
|
|
|
@ -742,6 +742,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"
|
||||
|
@ -1345,4 +1371,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args
|
|||
exit:
|
||||
return return_value;
|
||||
}
|
||||
/*[clinic end generated code: output=83c4a3f0e70e7775 input=a9049054013a1b77]*/
|
||||
/*[clinic end generated code: output=23ea9e176d86e026 input=a9049054013a1b77]*/
|
||||
|
|
Loading…
Reference in New Issue