Skip to content

Commit

Permalink
Prevent errors caused by unregistering memory twice. (#27)
Browse files Browse the repository at this point in the history
At the time of python program exit, the registry.cleanup() method
may be called before the remaining MPIShared objects are deleted.
Check that a shared memory buffer exists in the registry before
trying to free it.
  • Loading branch information
tskisner authored Jan 29, 2025
1 parent 48b946c commit d5e15b8
Show file tree
Hide file tree
Showing 2 changed files with 10 additions and 6 deletions.
10 changes: 9 additions & 1 deletion pshmem/registry.py
Original file line number Diff line number Diff line change
Expand Up @@ -20,10 +20,18 @@ def __init__(self):
self.reg = dict()

def register(self, name, buffer, noderank):
if name in self.reg:
msg = f"Buffer {name} already registered on node rank {noderank}"
raise RuntimeError(msg)
self.reg[name] = (buffer, noderank)

def unregister(self, name):
del self.reg[name]
if name in self.reg:
buf, noderank = self.reg[name]
buf.close()
if noderank == 0:
buf.unlink()
del self.reg[name]

def cleanup(self):
for name, (buf, noderank) in self.reg.items():
Expand Down
6 changes: 1 addition & 5 deletions pshmem/shmem.py
Original file line number Diff line number Diff line change
Expand Up @@ -376,12 +376,8 @@ def close(self):
del self._flat
if hasattr(self, "_shmem"):
if self._shmem is not None:
# Unregister the shared memory buffer, since we are about to close it.
# Unregister the shared memory buffer and close it.
registry.unregister(self._name)
self._shmem.close()
if self._noderank == 0:
self._shmem.unlink()
del self._shmem
self._shmem = None
self._flat = None
self.data = None
Expand Down

0 comments on commit d5e15b8

Please sign in to comment.