mirror of
https://github.com/python/cpython.git
synced 2025-08-04 08:59:19 +00:00
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
4 changed files with 58 additions and 2 deletions
|
@ -173,7 +173,10 @@ class SharedMemory:
|
||||||
)
|
)
|
||||||
finally:
|
finally:
|
||||||
_winapi.CloseHandle(h_map)
|
_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._mmap = mmap.mmap(-1, size, tagname=name)
|
||||||
|
|
||||||
self._size = size
|
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;
|
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]
|
/*[clinic input]
|
||||||
_winapi.OpenFileMapping -> HANDLE
|
_winapi.OpenFileMapping -> HANDLE
|
||||||
|
|
||||||
|
@ -2062,6 +2086,7 @@ static PyMethodDef winapi_functions[] = {
|
||||||
_WINAPI_READFILE_METHODDEF
|
_WINAPI_READFILE_METHODDEF
|
||||||
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
|
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
|
||||||
_WINAPI_TERMINATEPROCESS_METHODDEF
|
_WINAPI_TERMINATEPROCESS_METHODDEF
|
||||||
|
_WINAPI_UNMAPVIEWOFFILE_METHODDEF
|
||||||
_WINAPI_VIRTUALQUERYSIZE_METHODDEF
|
_WINAPI_VIRTUALQUERYSIZE_METHODDEF
|
||||||
_WINAPI_WAITNAMEDPIPE_METHODDEF
|
_WINAPI_WAITNAMEDPIPE_METHODDEF
|
||||||
_WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF
|
_WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF
|
||||||
|
|
28
Modules/clinic/_winapi.c.h
generated
28
Modules/clinic/_winapi.c.h
generated
|
@ -742,6 +742,32 @@ exit:
|
||||||
return return_value;
|
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__,
|
PyDoc_STRVAR(_winapi_OpenFileMapping__doc__,
|
||||||
"OpenFileMapping($module, desired_access, inherit_handle, name, /)\n"
|
"OpenFileMapping($module, desired_access, inherit_handle, name, /)\n"
|
||||||
"--\n"
|
"--\n"
|
||||||
|
@ -1345,4 +1371,4 @@ _winapi__mimetypes_read_windows_registry(PyObject *module, PyObject *const *args
|
||||||
exit:
|
exit:
|
||||||
return return_value;
|
return return_value;
|
||||||
}
|
}
|
||||||
/*[clinic end generated code: output=83c4a3f0e70e7775 input=a9049054013a1b77]*/
|
/*[clinic end generated code: output=23ea9e176d86e026 input=a9049054013a1b77]*/
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue