Re: select() on /dev/input/eventX not level-triggered?
From: Dmitry Torokhov <dmitry.torokhov@gmail.com>
Date: 2011-05-23 20:49:19
Also in:
lkml
On Mon, May 23, 2011 at 10:06:22PM +0200, Pavel Machek wrote:
On Mon 2011-05-23 11:13:12, Dmitry Torokhov wrote:quoted
On Fri, May 20, 2011 at 01:50:51AM +0200, Pavel Machek wrote:quoted
Hi! I'm debugging strange behaviour on /dev/input/eventX ... it seems that select is not behaving level-triggered as it apparently should. I can reproduce it when hitting windows & alt keys. Now, I really should rewrite it into C, first, but perhaps someone has an idea?(Ok, so we agree that select() should mark descriptor as ready as long as data are available... right?)quoted
Is this with next or with mainline? In next we try not to signal that FD is ready unless we have full packet in the buffer...2.6.39-rcX mainline.quoted
FWIW I see python indeed not reading the tail of events (btw the format should be 'llhhi' and the size on 64 bit arches is 24, not 16) but when I hacked evtest to use select and non-blockign read it all worked properly.It was on x32, but I'll fix that, thanks. Difference was I'm not using non-blocking read().
Does not matter.
It is unusual but should work AFAICT. Just read one packet when select shows its ready; if there's more than one, don't loop around read, but rely on select returning immediately. I did verify it on strace, so it should not be python artefact.
It is artefact of your program, you buffering your input. Use:
file = open("/dev/input/event3", "rb", 0)
Thanks.
--
Dmitry