mirror of
https://github.com/yuzu-emu/unicorn
synced 2024-11-25 10:58:59 +00:00
python: Fix exception in finalizer at exit (#873)
Sometimes, the finalizer for an `UcRef` runs so late that the members of the module have already been set to `None`. We need to make sure that we don't depend on anything in the module, or we risk getting a Exception when we try to access the `release_handle` method of `None` (`Uc`).
This commit is contained in:
parent
d7735487f7
commit
b0b5f8442d
1 changed files with 16 additions and 1 deletions
|
@ -251,11 +251,26 @@ class UcCleanupManager(object):
|
||||||
def register(self, uc):
|
def register(self, uc):
|
||||||
ref = UcRef(uc, self._finalizer)
|
ref = UcRef(uc, self._finalizer)
|
||||||
ref._uch = uc._uch
|
ref._uch = uc._uch
|
||||||
|
ref._class = uc.__class__
|
||||||
self._refs[id(ref)] = ref
|
self._refs[id(ref)] = ref
|
||||||
|
|
||||||
def _finalizer(self, ref):
|
def _finalizer(self, ref):
|
||||||
|
# note: this method must be completely self-contained and cannot have any references
|
||||||
|
# to anything else in this module.
|
||||||
|
#
|
||||||
|
# This is because it may be called late in the Python interpreter's shutdown phase, at
|
||||||
|
# which point the module's variables may already have been deinitialized and set to None.
|
||||||
|
#
|
||||||
|
# Not respecting that can lead to errors such as:
|
||||||
|
# Exception AttributeError:
|
||||||
|
# "'NoneType' object has no attribute 'release_handle'"
|
||||||
|
# in <bound method UcCleanupManager._finalizer of
|
||||||
|
# <unicorn.unicorn.UcCleanupManager object at 0x7f0bb83e4310>> ignored
|
||||||
|
#
|
||||||
|
# For that reason, we do not try to access the `Uc` class directly here but instead use
|
||||||
|
# the saved `._class` reference.
|
||||||
del self._refs[id(ref)]
|
del self._refs[id(ref)]
|
||||||
Uc.release_handle(ref._uch)
|
ref._class.release_handle(ref._uch)
|
||||||
|
|
||||||
class Uc(object):
|
class Uc(object):
|
||||||
_cleanup = UcCleanupManager()
|
_cleanup = UcCleanupManager()
|
||||||
|
|
Loading…
Reference in a new issue