Jan Kiszka wrote:
> 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. :)

Ok. Merged. It would need some work, as my test targets are all running
nfs. But that is certainly possible, as I think rtnetproxy now supports
UDP, does it?

-- 
                                            Gilles.

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

Reply via email to