timer: set O_NONBLOCK on the timerfd

Resetting a timerfd empties the data on the fd, so if the timer is reset
between triggering and us reading it, we may block trying to read it.

Since we read events off a device in a loop, a device sending a continuous
flow of events may cause the timer to trigger but delay reading it. If one of
the events cause e.g. the tap timer to be set, the timerfd may be empty at the
time of reading.

Suggested-by: Derek Foreman <derekf@osg.samsung.com>
Signed-off-by: Peter Hutterer <peter.hutterer@who-t.net>
This commit is contained in:
Peter Hutterer 2015-05-01 09:09:38 +10:00
parent 28ed7a6265
commit c2ef1854d8

View file

@ -122,7 +122,8 @@ libinput_timer_handler(void *data)
int int
libinput_timer_subsys_init(struct libinput *libinput) libinput_timer_subsys_init(struct libinput *libinput)
{ {
libinput->timer.fd = timerfd_create(CLOCK_MONOTONIC, TFD_CLOEXEC); libinput->timer.fd = timerfd_create(CLOCK_MONOTONIC,
TFD_CLOEXEC | TFD_NONBLOCK);
if (libinput->timer.fd < 0) if (libinput->timer.fd < 0)
return -1; return -1;