Gilles Chanteperdrix wrote:
> Jan Kiszka wrote:
>> Hi Gilles,
>>
>> I tend to think that xnselect_destroy should signal an event on the
>> dying fd instead of just clearing the binding. The task blocking on
>> select currently does not get a hint that the fd is dead and will block
>> on select until some other event arrives. That's unfortunately not
>> standard conforming.
> 
> Could you test the following patch? The fd will be in the "pending" set
> until the fd is reused, but that should be harmless as long as the fd is
> not in the "expected" set.
> 
> diff --git a/ksrc/nucleus/select.c b/ksrc/nucleus/select.c
> index fd56bfb..17c5e0b 100644
> --- a/ksrc/nucleus/select.c
> +++ b/ksrc/nucleus/select.c
> @@ -131,7 +131,8 @@ int xnselect_bind(struct xnselect *select_block,
>               __FD_SET(index, &selector->fds[type].pending);
>               if (xnselect_wakeup(selector))
>                       xnpod_schedule();
> -     }
> +     } else
> +             __FD_CLR(index, &selector->fds[type].pending);
>  
>       return 0;
>  }
> @@ -178,6 +179,7 @@ EXPORT_SYMBOL_GPL(__xnselect_signal);
>  void xnselect_destroy(struct xnselect *select_block)
>  {
>       xnholder_t *holder;
> +     int resched;
>       spl_t s;
>  
>       xnlock_get_irqsave(&nklock, s);
> @@ -190,11 +192,18 @@ void xnselect_destroy(struct xnselect *select_block)
>  
>               __FD_CLR(binding->bit_index,
>                        &selector->fds[binding->type].expected);
> -             __FD_CLR(binding->bit_index,
> -                      &selector->fds[binding->type].pending);
> +             if (!__FD_ISSET(binding->bit_index,
> +                             &selector->fds[binding->type].pending)) {
> +                     __FD_SET(binding->bit_index,
> +                              &selector->fds[binding->type].pending);
> +                     if (xnselect_wakeup(selector))
> +                             resched = 1;
> +             }
>               removeq(&selector->bindings, &binding->slink);
>               xnlock_put_irqrestore(&nklock, s);
>  
> +             if (resched)
> +                     xnpod_schedule();
>               xnfree(binding);
>               
>               xnlock_get_irqsave(&nklock, s);
> 

Works perfectly! You may test yourself using the RT-TCP examples from
latest RTnet git. :)

Thanks,
Jan

-- 
Siemens AG, Corporate Technology, CT T DE IT 1
Corporate Competence Center Embedded Linux

_______________________________________________
Xenomai-core mailing list
Xenomai-core@gna.org
https://mail.gna.org/listinfo/xenomai-core

Reply via email to