HID: Handle report waiting interruptions properly.
B_INTERRUPTED is already used by the report processing code,
instead return B_CANCELED and handle this specially.
Fixes #19530.
Diff
src/add-ons/kernel/drivers/input/hid_shared/HIDReport.cpp | 3 ++-
src/add-ons/kernel/drivers/input/hid_shared/KeyboardProtocolHandler.cpp | 2 +-
src/add-ons/kernel/drivers/input/hid_shared/MouseProtocolHandler.cpp | 2 +-
src/add-ons/kernel/drivers/input/hid_shared/TabletProtocolHandler.cpp | 2 +-
4 files changed, 5 insertions(+), 4 deletions(-)
@@ -235,12 +235,13 @@
status_t result = fParser->Device()->MaybeScheduleTransfer(this);
if (result != B_OK) {
TRACE_ALWAYS("scheduling transfer failed\n");
conditionVariableEntry.Wait(B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, 0);
return result;
}
result = conditionVariableEntry.Wait(B_RELATIVE_TIMEOUT | B_CAN_INTERRUPT, timeout);
TRACE("waiting for report returned with result: %s\n", strerror(result));
if (result == B_INTERRUPTED)
return B_CANCELED;
if (result != B_OK)
return result;
@@ -514,7 +514,7 @@
return B_ERROR;
}
if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
return B_CANCELED;
if (result != B_TIMED_OUT && result != B_INTERRUPTED) {
@@ -192,7 +192,7 @@
return B_DEV_NOT_READY;
}
if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
return B_CANCELED;
if (result != B_INTERRUPTED) {
@@ -242,7 +242,7 @@
return B_DEV_NOT_READY;
}
if ((*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
if (result == B_CANCELED || (*cookie & PROTOCOL_HANDLER_COOKIE_FLAG_CLOSED) != 0)
return B_CANCELED;
if (result != B_INTERRUPTED) {