Thread (5 messages) 5 messages, 2 authors, 2011-05-23

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
Keyboard shortcuts
hback out one level
jnext message in thread
kprevious message in thread
ldrill in
Escclose help / fold thread tree
?toggle this help