Skip to content

Commit 85c128e

Browse files
authored
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.
1 parent 8749121 commit 85c128e

File tree

4 files changed

+58
-2
lines changed

4 files changed

+58
-2
lines changed

Lib/multiprocessing/shared_memory.py

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,10 @@ def __init__(self, name=None, create=False, size=0):
173173
)
174174
finally:
175175
_winapi.CloseHandle(h_map)
176-
size = _winapi.VirtualQuerySize(p_buf)
176+
try:
177+
size = _winapi.VirtualQuerySize(p_buf)
178+
finally:
179+
_winapi.UnmapViewOfFile(p_buf)
177180
self._mmap = mmap.mmap(-1, size, tagname=name)
178181

179182
self._size = size
Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
Fix a memory leak in :class:`multiprocessing.shared_memory.SharedMemory` on
2+
Windows.

Modules/_winapi.c

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1393,6 +1393,30 @@ _winapi_MapViewOfFile_impl(PyObject *module, HANDLE file_map,
13931393
return address;
13941394
}
13951395

1396+
/*[clinic input]
1397+
_winapi.UnmapViewOfFile
1398+
1399+
address: LPCVOID
1400+
/
1401+
[clinic start generated code]*/
1402+
1403+
static PyObject *
1404+
_winapi_UnmapViewOfFile_impl(PyObject *module, LPCVOID address)
1405+
/*[clinic end generated code: output=4f7e18ac75d19744 input=8c4b6119ad9288a3]*/
1406+
{
1407+
BOOL success;
1408+
1409+
Py_BEGIN_ALLOW_THREADS
1410+
success = UnmapViewOfFile(address);
1411+
Py_END_ALLOW_THREADS
1412+
1413+
if (!success) {
1414+
return PyErr_SetFromWindowsErr(0);
1415+
}
1416+
1417+
Py_RETURN_NONE;
1418+
}
1419+
13961420
/*[clinic input]
13971421
_winapi.OpenFileMapping -> HANDLE
13981422
@@ -2062,6 +2086,7 @@ static PyMethodDef winapi_functions[] = {
20622086
_WINAPI_READFILE_METHODDEF
20632087
_WINAPI_SETNAMEDPIPEHANDLESTATE_METHODDEF
20642088
_WINAPI_TERMINATEPROCESS_METHODDEF
2089+
_WINAPI_UNMAPVIEWOFFILE_METHODDEF
20652090
_WINAPI_VIRTUALQUERYSIZE_METHODDEF
20662091
_WINAPI_WAITNAMEDPIPE_METHODDEF
20672092
_WINAPI_WAITFORMULTIPLEOBJECTS_METHODDEF

Modules/clinic/_winapi.c.h

Lines changed: 27 additions & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)