Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
29 changes: 13 additions & 16 deletions Lib/multiprocessing/shared_memory.py
Original file line number Diff line number Diff line change
Expand Up @@ -65,15 +65,14 @@ class SharedMemory:

# Defaults; enables close() and unlink() to run without errors.
_name = None
_fd = -1
_mmap = None
_buf = None
_flags = os.O_RDWR
_mode = 0o600
_prepend_leading_slash = True if _USE_POSIX else False
_track = True

def __init__(self, name=None, create=False, size=0, *, track=True):
def __init__(self, name=None, create=False, size=0, *, track=True, reserve=False):
if not size >= 0:
raise ValueError("'size' must be a positive integer")
if create:
Expand All @@ -92,7 +91,7 @@ def __init__(self, name=None, create=False, size=0, *, track=True):
while True:
name = _make_filename()
try:
self._fd = _posixshmem.shm_open(
fd = _posixshmem.shm_open(
name,
self._flags,
mode=self._mode
Expand All @@ -103,21 +102,28 @@ def __init__(self, name=None, create=False, size=0, *, track=True):
break
else:
name = "/" + name if self._prepend_leading_slash else name
self._fd = _posixshmem.shm_open(
fd = _posixshmem.shm_open(
name,
self._flags,
mode=self._mode
)
self._name = name
try:
if create and size:
os.ftruncate(self._fd, size)
stats = os.fstat(self._fd)
if hasattr(os, 'posix_fallocate') and reserve:
# Ensures the requested size is available
os.posix_fallocate(fd, 0, size)
else:
os.ftruncate(fd, size)
stats = os.fstat(fd)
size = stats.st_size
self._mmap = mmap.mmap(self._fd, size)
self._mmap = mmap.mmap(fd, size)

Copy link
Copy Markdown
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

should we add trackfd=False here? BUT see my other overall comment.

except OSError:
self.unlink()
raise
finally:
os.close(fd)

if self._track:
resource_tracker.register(self._name, "shared_memory")

Expand Down Expand Up @@ -184,12 +190,6 @@ def __init__(self, name=None, create=False, size=0, *, track=True):
self._size = size
self._buf = memoryview(self._mmap)

def __del__(self):
try:
self.close()
except OSError:
pass

def __reduce__(self):
return (
self.__class__,
Expand Down Expand Up @@ -231,9 +231,6 @@ def close(self):
if self._mmap is not None:
self._mmap.close()
self._mmap = None
if _USE_POSIX and self._fd >= 0:
os.close(self._fd)
self._fd = -1

def unlink(self):
"""Requests that the underlying shared memory block be destroyed.
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,3 @@
:class:`multiprocessing.shared_memory.SharedMemory` no longer holds on to a
file descriptor on Posix platforms, and does not forcibly close its buffer
when finalized.
Loading