Interrupt USB polling thread before threading shutdown #480
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.
WIP: requires libusb1 version bump after vpelletier/python-libusb1#90 is merged.
While performing
USBContext.handleEvents()
the poller thread is uninterruptible other than through libusb1 API. Since the Python runtime joins all non-daemon threads on threading shutdown it is necessary to interrupt the thread by calling the corresponding libusb1 function.A seemingly obvious solution is to make the thread a daemon thread so that it is not joined on threading shutdown. Unfortunately this only makes the problem worse. All daemon threads are instantly killed, leaving a lock within libusb1 permanently taken, and causing a hang later when python-libusb1 objects are garbage collected.
Fixes #413.