This bug is root caused in xorg-server os layer, attaching patch to fix it and sending it to xorg-devel list.
Created attachment 109479 [details] [review]
[PATCH] os: Fix timer race conditions
Now patch is merged, should status be updated?
It would be great to update status so this flows to Ubuntu's bug tracker.
Yeah, it should. Thanks for the ping.
Marking fixed with commit fe4c774c572e3f55a7417f0ca336ae1479a966ad
Author: Nikhil Mahale <firstname.lastname@example.org>
Date: Sat Jan 24 17:06:59 2015 -0800
os: Fix timer race conditions
Fixing following kind of race-conditions -
----> // timers -> timer-1 -> timer-2 -> null
while (timers && (int) (timers->expires - now) <= 0)
// prototype - DoTimer(OsTimerPtr timer, CARD32 now, OsTimerPtr *prev)
DoTimer(timers, now, &timers)
----> OsBlockSignals(); .... OS Signal comes just before blocking it,
.... timer-1 handler gets called.
// timer-1 gets served and scheduled again;
// timers -> timer-2 -> timer-1 -> null
*prev = timer->next;
timer->next = NULL; // timers -> null
// timers list gets corrupted here and timer-2 gets removed from list.
Signed-off-by: Nikhil Mahale <email@example.com>
Reviewed-by: Julien Cristau <firstname.lastname@example.org>
v2: Apply warning fixes from Keith Packard <email@example.com>
Reviewed-by: Aaron Plattner <firstname.lastname@example.org>
Signed-off-by: Aaron Plattner <email@example.com>
Signed-off-by: Keith Packard <firstname.lastname@example.org>
os/WaitFor.c | 41 ++++++++++++++++++++++++++---------------
1 file changed, 26 insertions(+), 15 deletions(-)