[PATCH xserver] os: Do timers under input lock, not blocked signals
Peter Hutterer
peter.hutterer at who-t.net
Tue Jun 7 22:03:53 UTC 2016
On Sun, Jun 05, 2016 at 01:04:16PM -0700, Keith Packard wrote:
> Timer processing can happen on either the main thread or the input
> thread. As a result, it must be done under the input lock.
>
> Signals are unrelated to timers now that SIGIO isn't used for input
> processing, so stop blocking signals while processing timers.
>
> Signed-off-by: Keith Packard <keithp at keithp.com>
Reviewed-by: Peter Hutterer <peter.hutterer at who-t.net>
Cheers,
Peter
> ---
> os/WaitFor.c | 28 ++++++++++++++--------------
> 1 file changed, 14 insertions(+), 14 deletions(-)
>
> diff --git a/os/WaitFor.c b/os/WaitFor.c
> index e839d61..b82f826 100644
> --- a/os/WaitFor.c
> +++ b/os/WaitFor.c
> @@ -398,7 +398,7 @@ CheckAllTimers(void)
> OsTimerPtr timer;
> CARD32 now;
>
> - OsBlockSignals();
> + input_lock();
> start:
> now = GetTimeInMillis();
>
> @@ -408,7 +408,7 @@ CheckAllTimers(void)
> goto start;
> }
> }
> - OsReleaseSignals();
> + input_unlock();
> }
>
> static void
> @@ -416,10 +416,10 @@ DoTimer(OsTimerPtr timer, CARD32 now, volatile OsTimerPtr *prev)
> {
> CARD32 newTime;
>
> - OsBlockSignals();
> + input_lock();
> *prev = timer->next;
> timer->next = NULL;
> - OsReleaseSignals();
> + input_unlock();
>
> newTime = (*timer->callback) (timer, now, timer->arg);
> if (newTime)
> @@ -439,7 +439,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
> return NULL;
> }
> else {
> - OsBlockSignals();
> + input_lock();
> for (prev = &timers; *prev; prev = &(*prev)->next) {
> if (*prev == timer) {
> *prev = timer->next;
> @@ -448,7 +448,7 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
> break;
> }
> }
> - OsReleaseSignals();
> + input_unlock();
> }
> if (!millis)
> return timer;
> @@ -468,13 +468,13 @@ TimerSet(OsTimerPtr timer, int flags, CARD32 millis,
> if (!millis)
> return timer;
> }
> - OsBlockSignals();
> + input_lock();
> for (prev = &timers;
> *prev && (int) ((*prev)->expires - millis) <= 0;
> prev = &(*prev)->next);
> timer->next = *prev;
> *prev = timer;
> - OsReleaseSignals();
> + input_unlock();
> return timer;
> }
>
> @@ -484,7 +484,7 @@ TimerForce(OsTimerPtr timer)
> int rc = FALSE;
> volatile OsTimerPtr *prev;
>
> - OsBlockSignals();
> + input_lock();
> for (prev = &timers; *prev; prev = &(*prev)->next) {
> if (*prev == timer) {
> DoTimer(timer, GetTimeInMillis(), prev);
> @@ -492,7 +492,7 @@ TimerForce(OsTimerPtr timer)
> break;
> }
> }
> - OsReleaseSignals();
> + input_unlock();
> return rc;
> }
>
> @@ -503,14 +503,14 @@ TimerCancel(OsTimerPtr timer)
>
> if (!timer)
> return;
> - OsBlockSignals();
> + input_lock();
> for (prev = &timers; *prev; prev = &(*prev)->next) {
> if (*prev == timer) {
> *prev = timer->next;
> break;
> }
> }
> - OsReleaseSignals();
> + input_unlock();
> }
>
> void
> @@ -528,10 +528,10 @@ TimerCheck(void)
> CARD32 now = GetTimeInMillis();
>
> if (timers && (int) (timers->expires - now) <= 0) {
> - OsBlockSignals();
> + input_lock();
> while (timers && (int) (timers->expires - now) <= 0)
> DoTimer(timers, now, &timers);
> - OsReleaseSignals();
> + input_unlock();
> }
> }
>
> --
> 2.8.1
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: https://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list