fix(hid): Eliminate data race in USB pathway causing dropped keys [ALTERNATIVE] #2267
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.
Alternative to #2257, solving the same problem which happens there, perhaps more elegantly. We simply move the existing mutex to protect calls to
hid_int_ep_write()
as well as the passed buffer, causingzmk_usb_hid_send_report()
to become synchronous on first invocation. (Subsequent invocations ofzmk_usb_hid_send_report()
while the first USB TX was pending also blocked previously.)The cost of the introduced synchronous delay upon first invocation can be mitigated (and latency I imagine actually slightly improved in some applications) by wrapping
zmk_usb_hid_send_report()
in a work queue, but I doubt this is worth the memory + task switching penalty. After all, the whole reason the data race wasn't discovered for so long was because the USB TX transactions were completing so blazingly fast in the first place.Tested working on real hardware (Adv360 Pro).
Closes #2253, closes #2257.