libusb backend: attempt to fix DRAIN_OUTPUT race condition. Fixes #1461#1500
Draft
ValdikSS wants to merge 1 commit intoOpenPrinting:2.4.xfrom
Draft
libusb backend: attempt to fix DRAIN_OUTPUT race condition. Fixes #1461#1500ValdikSS wants to merge 1 commit intoOpenPrinting:2.4.xfrom
ValdikSS wants to merge 1 commit intoOpenPrinting:2.4.xfrom
Conversation
…nPrinting#1461 CUPS_SC_CMD_DRAIN_OUTPUT sidechannel command is supposed to ensure that all the data sent by the filter would be consumed by the backend and sent to the printer via USB before it returns. However, if backend's main thread read and processed filter's data before filter managed to send CUPS_SC_CMD_DRAIN_OUTPUT, the filter will be blocked for 1 second, as backend will be blocked in select() waiting for new data (while filter is waiting for DRAIN_OUTPUT response and does not send anything). This is a hacky attempt to fix this issue. However, it's not without flaw: * If backend's main thread is slow and sidechannel thread is fast, the response to CUPS_SC_CMD_DRAIN_OUTPUT may be sent without actually draining (and even reading) the data. * This means that's a tradeoff towards potentially breaking framing of some USB protocols to prevent 1-second locking (and breaking printing for timing-sensitive protocols).
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
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.
CUPS_SC_CMD_DRAIN_OUTPUT sidechannel command is supposed to ensure that all the data sent by the filter would be consumed by the backend and sent to the printer via USB before it returns.
However, if backend's main thread read and processed filter's data before filter managed to send CUPS_SC_CMD_DRAIN_OUTPUT, the filter will be blocked for 1 second, as backend will be blocked in select() waiting for new data (while filter is waiting for DRAIN_OUTPUT response and does not send anything).
This is a hacky attempt to fix this issue. However, it's not without flaw: