Skip to content

libusb backend: attempt to fix DRAIN_OUTPUT race condition. Fixes #1461#1500

Draft
ValdikSS wants to merge 1 commit intoOpenPrinting:2.4.xfrom
ValdikSS:usb-race-condition-2.4
Draft

libusb backend: attempt to fix DRAIN_OUTPUT race condition. Fixes #1461#1500
ValdikSS wants to merge 1 commit intoOpenPrinting:2.4.xfrom
ValdikSS:usb-race-condition-2.4

Conversation

@ValdikSS
Copy link
Member

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).

…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).
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant