[PATCH libinput 1/2] timer: if a timer is inactive, do not call the timer func

Peter Hutterer peter.hutterer at who-t.net
Mon Jul 17 03:57:03 UTC 2017

Race conditions may happen where code that cancels a timer is called just
as that timer triggers. If we cancel a timer, we assume that we've put the
code into a state where the timer firing will trigger a bug.

This could be observed with the middle button code if the release event was
held back just long enough. The button release code cancelled the timer, set
the state back to idle and then complained when the timeout handling sent a
'timeout' event while being in idle.

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
 src/timer.c | 3 +++
 1 file changed, 3 insertions(+)

diff --git a/src/timer.c b/src/timer.c
index b152ae8f..5d9fc512 100644
--- a/src/timer.c
+++ b/src/timer.c
@@ -145,6 +145,9 @@ libinput_timer_handler(void *data)
 	list_for_each_safe(timer, tmp, &libinput->timer.list, link) {
+		if (timer->expire == 0)
+			continue;
 		if (timer->expire <= now) {
 			/* Clear the timer before calling timer_func,
 			   as timer_func may re-arm it */

More information about the wayland-devel mailing list