diff --git a/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.cpp b/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.cpp index f7d1380643..085752b052 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.cpp +++ b/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.cpp @@ -31,6 +31,7 @@ JoystickProtocolHandler::JoystickProtocolHandler(HIDReport &report) fButtonCount(0), fMaxButton(0), fButtons(NULL), + fOpenCount(0), fUpdateThread(-1) { mutex_init(&fUpdateLock, "joystick update lock"); @@ -101,7 +102,7 @@ JoystickProtocolHandler::JoystickProtocolHandler(HIDReport &report) fCurrentValues.initialize(fAxisCount, 0, fMaxButton); - TRACE("joystick device with %lu buttons\n", buttonCount); + TRACE("joystick device with %lu buttons\n", fButtonCount); TRACE("report id: %u\n", report.ID()); } @@ -190,6 +191,9 @@ JoystickProtocolHandler::Open(uint32 flags, uint32 *cookie) resume_thread(fUpdateThread); } + if (result == B_OK) + fOpenCount++; + mutex_unlock(&fUpdateLock); if (result != B_OK) return result; @@ -203,7 +207,8 @@ JoystickProtocolHandler::Close(uint32 *cookie) { status_t result = mutex_lock(&fUpdateLock); if (result == B_OK) { - fUpdateThread = -1; + if (--fOpenCount == 0) + fUpdateThread = -1; mutex_unlock(&fUpdateLock); } diff --git a/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.h b/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.h index fdba0476b6..6c8a4476c2 100644 --- a/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.h +++ b/src/add-ons/kernel/drivers/input/usb_hid/JoystickProtocolHandler.h @@ -55,6 +55,7 @@ private: joystick_module_info fJoystickModuleInfo; variable_joystick fCurrentValues; + uint32 fOpenCount; mutex fUpdateLock; thread_id fUpdateThread; };