diff --git a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp index 4811d4a1b9..5adde5b699 100644 --- a/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp +++ b/src/add-ons/input_server/devices/keyboard/KeyboardInputDevice.cpp @@ -379,8 +379,8 @@ KeyboardInputDevice::KeyboardInputDevice() { CALLED(); - _RecursiveScan(kKeyboardDevicesDirectory); StartMonitoringDevice(kKeyboardDevicesDirectory); + _RecursiveScan(kKeyboardDevicesDirectory); } @@ -618,8 +618,16 @@ KeyboardInputDevice::_DeviceWatcher(void* arg) while (device->active) { if (ioctl(device->fd, KB_READ, &buffer) != B_OK) { - device->device_watcher = -1; - device->owner->_RemoveDevice(device->path); + if (device->active) { + device->device_watcher = -1; + device->owner->_RemoveDevice(device->path); + } else { + // In case active is already false, another thread + // waits for this thread to quit, and may already hold + // locks that _RemoveDevice() wants to acquire. In another + // words, the device is already being removed, so we simply + // quit here. + } // TOAST! return 0; } diff --git a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp index 8d2ac4d645..2868b28af3 100644 --- a/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp +++ b/src/add-ons/input_server/devices/mouse/MouseInputDevice.cpp @@ -234,8 +234,16 @@ MouseDevice::_Run() memset(&movements, 0, sizeof(movements)); if (ioctl(fDevice, MS_READ, &movements) != B_OK) { - fThread = -1; - fTarget._RemoveDevice(fPath.String()); + if (fActive) { + fThread = -1; + fTarget._RemoveDevice(fPath.String()); + } else { + // In case active is already false, another thread + // waits for this thread to quit, and may already hold + // locks that _RemoveDevice() wants to acquire. In another + // words, the device is already being removed, so we simply + // quit here. + } // TOAST! return; } @@ -410,8 +418,8 @@ MouseInputDevice::MouseInputDevice() { CALLED(); - _RecursiveScan(kMouseDevicesDirectory); StartMonitoringDevice(kMouseDevicesDirectory); + _RecursiveScan(kMouseDevicesDirectory); }