diff --git a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp index 0ca2c4b74b..4fb955cfa1 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.cpp @@ -240,6 +240,11 @@ status_t HIDDevice::Close() { fOpen = false; + // make threads waiting for a transfer bail out + if (fTransferNotifySem >= 0) { + delete_sem(fTransferNotifySem); + fTransferNotifySem = -1; + } return B_OK; } diff --git a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h index 3acb560785..656b901dd4 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h +++ b/src/add-ons/kernel/drivers/input/usb_hid/HIDDevice.h @@ -78,7 +78,7 @@ static void _TransferCallback(void *cookie, char * fName; int32 fParentCookie; - bool fOpen; +volatile bool fOpen; bool fRemoved; struct ring_buffer * fRingBuffer; diff --git a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp index dc24391cf4..170042c803 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/KeyboardDevice.cpp @@ -65,15 +65,15 @@ KeyboardDevice::Control(uint32 op, void *buffer, size_t length) _SetTransferProcessed(); if (result != B_OK) return result; - } else if (result == B_TIMED_OUT) { + } else if (result == B_TIMED_OUT && IsOpen()) { // this case is for handling key repeats, it means // no interrupt transfer has happened _WriteKey(fCurrentRepeatKey, true); // the next timeout is reduced to the repeat_rate fCurrentRepeatDelay = fRepeatRate; - } else if (result == B_INTERRUPTED) + } else if (result == B_INTERRUPTED && IsOpen()) { continue; - else if (result != B_OK) + } else return result; }