Re: [PATCH] Input: new EVIOCGKEYF to get keystate and flush queues

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



Hi Dmitry

On Sat, Feb 16, 2013 at 10:10 PM, Dmitry Torokhov
<dmitry.torokhov@xxxxxxxxx> wrote:
> Hi David,
>
> On Mon, Jan 07, 2013 at 12:58:23PM +0100, David Herrmann wrote:
>> EVIOCGKEYF returns the current keystate similar to EVIOCGKEY but also
>> flushes the outgoing evdev event queue. This allows user-space devices to
>> reliably retrieve the current state without having old events still in the
>> read()-queue.
>>
>> Userspace libraries like XKB/xkbcommon use stacking key trackers, so they
>> allow the kernel to map multiple keys to the same keycode. For instance if
>> left-shift and right-shift map to the same keycode, xkbcommon allows the
>> kernel to send key-down twice but also requires it to send key-up twice. A
>> single input device doesn't support that, but this is very useful if you want
>> multiple connected keyboards to have one shared modifier state: Pressing Shift
>> on the one keyboard affects keys on the other keyboard. This is not the usual
>> setup but it is supported and known to be used (for instance if you have
>> external num-pads etc.).
>>
>> When a program opens input devices, it can read the keystate via EVIOCGKEY
>> to update its internal keyboard state. This allows to keep CTRL pressed
>> while switching VTs and having both applications remember that CTRL is
>> still pressed.
>> However, if there are still outgoing events in the evdev queue, the
>> application will update its internal keyboard state and then read the
>> event again, even though it already processed it via EVIOCGKEY.
>>
>> EVIOCGKEYF solves this race condition by flushing the evdev queue while
>> returning the keystate. We cannot change EVIOCGKEY because we don't know
>> whether userspace depends on a clean read() history and flushing the queue
>> effectively drops events.
>>
>> This race could be fixed in user-space by keeping an exact copy of the keystate
>> array for each input device that we opened and ignoring double-events for a
>> single keycode. However, if we, as mentioned, want a shared keyboard-state, it
>> seems to be a waste of computing power and memory to keep another copy for each
>> input device if we could just use something like EVIOCGKEYF.
>
> I do not think we should introduce the new ioctl as I really doubt
> anyone is using it and even if they do I really doubt they will have
> problems if we flush the events.
>
> But rather that flushing all events we should only flush the key events.
> The relative, absolute, and other events should be kept in the queue.

(seems we have nearly the same delay for responses, sorry..)

I'm not entirely sure whether I understand you correctly. Do you
propose to just fix EVIOCGKEY to flush the queues? It does break
semantics, but I agree, that this probably fixes existing userspace
and does not break it.

So if you agree, I will prepare a fix that flushes pending KEY-events
for EVIOCGKEY. And I will try to do the same for ABS/REL events. And
if you're too busy, I'll send it anyway ;)

I'm also talking to XKB developers and it really seems that userspace
already expects those semantics. I haven't found any application that
expects the queues to report the duplicate events.

But I'd really like to see this fixed. I hate knowing that there is a
theoretical race-condition and I keep reminding myself of it..

Thanks
David
--
To unsubscribe from this list: send the line "unsubscribe linux-input" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at  http://vger.kernel.org/majordomo-info.html




[Index of Archives]     [Linux Media Devel]     [Linux USB Devel]     [Video for Linux]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Linux Wireless Networking]     [Linux Omap]

  Powered by Linux