Remove references to self when creating device finalizers #132
Add this suggestion to a batch that can be applied as a single commit.
This suggestion is invalid because no changes were made to the code.
Suggestions cannot be applied while the pull request is closed.
Suggestions cannot be applied while viewing a subset of changes.
Only one suggestion per line can be applied in a batch.
Add this suggestion to a batch that can be applied as a single commit.
Applying suggestions on deleted lines is not supported.
You must change the existing code in this line in order to create a valid suggestion.
Outdated suggestions cannot be applied.
This suggestion has been applied or marked resolved.
Suggestions cannot be applied from pending reviews.
Suggestions cannot be applied on multi-line comments.
Suggestions cannot be applied while the pull request is queued to merge.
Suggestion cannot be applied right now. Please check back later.
Reported-by @bearsh in #130 (comment).
From the documentation:
The issue wasn't observed during testing, but it may be implementation-defined (as with
__del__
) and depend on specificcombinations of interpreter and Cython versions.
Instead of relying on unspecified behavior, only keep the
hid_device
pointer. This requires a wrapper becauseweakref.finalize()
cannot be passedcdef
functions or C pointers.Alternatives were attempted—
__dealloc__
,weakref.ref(self)
—but they only worked in some cases (respectively: only fordel <device>
and except fordel <device>
).Besides removing references to
self
from the finalizers, also fix another problem in #130: raise aRuntimeError
ifopen()
/open_path()
are called on an already opendevice()
, preventing the oldhid_device *
to leak, which would later crashhid_exit()
.