[PATCH] sync: Avoid ridiculously long timeouts

Matthieu Herrb matthieu at herrb.eu
Sun Dec 15 23:04:39 PST 2013


On Sun, Dec 15, 2013 at 02:31:10PM +0100, Mark Kettenis wrote:
> From: Mark Kettenis <kettenis at openbsd.org>
> 
> On OpenBSD, passing a timeout longer than 100000000 seconds to select(2) will
> make it fail with EINVAL.  As this is original 4.4BSD behaviour it is not
> inconceivable that other systems suffer from the same problem.  And Linux,
> though not suffering from any 4.4BSD heritage, briefly did something similar:
> 
> <https://lkml.org/lkml/2012/8/31/263>
> 
> So avoid calling AdjustWaitForDelay() instead of setting the timeout to
> (effectively) ULONG_MAX milliseconds.
> 
> Signed-off-by: Mark Kettenis <kettenis at openbsd.org>

Reviewed-by: Matthieu Herrb <matthieu at herrb.eu>

> ---
>  Xext/sync.c | 7 ++-----
>  1 file changed, 2 insertions(+), 5 deletions(-)
> 
> diff --git a/Xext/sync.c b/Xext/sync.c
> index 2d58ea1..c33b5b5 100644
> --- a/Xext/sync.c
> +++ b/Xext/sync.c
> @@ -2731,27 +2731,24 @@ IdleTimeBlockHandler(pointer pCounter, struct timeval **wt, pointer LastSelectMa
>           * If we've been idle more than it, and someone wants to know about
>           * that level-triggered, schedule an immediate wakeup.
>           */
> -        unsigned long timeout = -1;
>  
>          if (XSyncValueLessThan(idle, *greater)) {
>              XSyncValue value;
>              Bool overflow;
>  
>              XSyncValueSubtract(&value, *greater, idle, &overflow);
> -            timeout = min(timeout, XSyncValueLow32(value));
> +            AdjustWaitForDelay(wt, XSyncValueLow32(value));
>          }
>          else {
>              for (list = counter->sync.pTriglist; list;
>                   list = list->next) {
>                  trig = list->pTrigger;
>                  if (trig->CheckTrigger(trig, old_idle)) {
> -                    timeout = min(timeout, 0);
> +                    AdjustWaitForDelay(wt, 0);
>                      break;
>                  }
>              }
>          }
> -
> -        AdjustWaitForDelay(wt, timeout);
>      }
>  
>      counter->value = old_idle;  /* pop */
> -- 
> 1.8.4.3
> 
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel

-- 
Matthieu Herrb


More information about the xorg-devel mailing list