mirror of https://github.com/jetkvm/kvm.git
chore: add timeout for KeypressReport
This commit is contained in:
parent
d05ed45871
commit
720cd40157
|
@ -396,10 +396,7 @@ var KeyCodeToMaskMap = map[byte]byte{
|
||||||
RightSuper: ModifierMaskRightSuper,
|
RightSuper: ModifierMaskRightSuper,
|
||||||
}
|
}
|
||||||
|
|
||||||
func (u *UsbGadget) keypressReport(key byte, press bool, autoRelease bool) (KeysDownState, error) {
|
func (u *UsbGadget) keypressReportNonThreadSafe(key byte, press bool, autoRelease bool) (KeysDownState, error) {
|
||||||
u.keyboardLock.Lock()
|
|
||||||
defer u.keyboardLock.Unlock()
|
|
||||||
|
|
||||||
defer u.resetUserInputTime()
|
defer u.resetUserInputTime()
|
||||||
|
|
||||||
// IMPORTANT: This code parallels the logic in the kernel's hid-gadget driver
|
// IMPORTANT: This code parallels the logic in the kernel's hid-gadget driver
|
||||||
|
@ -484,6 +481,31 @@ func (u *UsbGadget) keypressReport(key byte, press bool, autoRelease bool) (Keys
|
||||||
return u.UpdateKeysDown(modifier, keys), err
|
return u.UpdateKeysDown(modifier, keys), err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
type keypressReportResult struct {
|
||||||
|
KeysDownState KeysDownState
|
||||||
|
Error error
|
||||||
|
}
|
||||||
|
|
||||||
|
func (u *UsbGadget) keypressReport(key byte, press bool, autoRelease bool) (KeysDownState, error) {
|
||||||
|
u.keyboardLock.Lock()
|
||||||
|
defer u.keyboardLock.Unlock()
|
||||||
|
|
||||||
|
r := make(chan keypressReportResult)
|
||||||
|
go func() {
|
||||||
|
state, err := u.keypressReportNonThreadSafe(key, press, autoRelease)
|
||||||
|
r <- keypressReportResult{KeysDownState: state, Error: err}
|
||||||
|
}()
|
||||||
|
|
||||||
|
select {
|
||||||
|
case <-time.After(1 * time.Second):
|
||||||
|
u.log.Warn().Msg("keypressReport timed out, possibly stuck")
|
||||||
|
return u.keysDownState, fmt.Errorf("keypressReport timed out, possibly stuck")
|
||||||
|
case ret := <-r:
|
||||||
|
u.log.Debug().Msg("keypressReport handled")
|
||||||
|
return ret.KeysDownState, ret.Error
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
func (u *UsbGadget) KeypressReport(key byte, press bool) (KeysDownState, error) {
|
func (u *UsbGadget) KeypressReport(key byte, press bool) (KeysDownState, error) {
|
||||||
return u.keypressReport(key, press, true)
|
return u.keypressReport(key, press, true)
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue