Jan Kiszka writes: 

> Paolo Mantegazza wrote:
>> Jan Kiszka writes:
>>> Paolo Mantegazza wrote:
>>>> M. Koehrer wrote:
>>>>> Hi Dennis,
>>>>> I have just detected the very same effect. At least with RTAI-3.3cv
>>>>> it is not working.
>>>>> In rtnet's rt_udp_recvmsg()
>>>>> the timeout will be set to -1 if the flag MSG_DONTWAIT is used.
>>>>> The call to rtdm_sem_timeddown() with this timeout value fails as
>>>>> the resulting RTAI
>>>>> function _sem_wait_timed rejects a negative timeout => it returns
>>>>> -EWOULDBLOCK immediately
>>>>> without checking the semaphores value.
>>>>> RTDM in RTAI seems not to handle a polling semaphore check correctly.
>>>>> That means the only possible way (without changing rtdm) is to it
>>>>> the way you have done it:
>>>>> Using a extreme small timeout value (=1).
>>>>> By looking at the code I saw same strange things:
>>>>> In rtnet, the time type nanosecs_t is a uint64, however in RTAI's
>>>>> rtdm the timetype is a signed int64.
>>>>> That could lead to confusion...
>>>>> To fix the MSG_DONTWAIT issue I have detected, the code can be
>>>>> modified to set the timeout
>>>>> to 1 (instead of -1) whenever MSG_DONTWAIT is specified.
>>>>
>>>> Negative timeouts produce -EWOULDBLOCK  in the original
>>>> implementation of RTDM also. The difference is that there the sem
>>>> count check is anticipated and the count simply decremented with
>>>> immediate return if it is greater than zero. RTAI checks for
>>>> -EWOULDBLOCK before and so it does not call its timed sem_wait, where
>>>> the sem count will be decremented, withoutn any timeout, if it is
>>>> greater then zero. So it will behave as expected.
>>>> Clearly the solution woulfd be to use 0, but it cannot, as zero
>>>> indicates an infinite delay in RTDM. So one (nanosec) has to be the
>>>> compromise. Notice it will never produce any delay, either because
>>>> sem count is greater than zero or because it is too low a value and
>>>> RTAI will timeout immediately anyhow, as it is never worth to have to
>>>> reschedule for a single nanosec.
>>>
>>> rtdm_sem_timeddown:
>>> "This function tries to decrement the given semphore's value if it is
>>>  positive on entry. If not, the caller is blocked unless non-blocking
>>>  operation was selected."
>>> I read my one text here, so I may interpret it implicitly as I want it
>>> to be. But to me it sounds like: "Try to get the sem first, then block
>>> or fail."
>>> Please consider fixing RTAI's RTDM layer, e.g. by mapping timeouts < 0
>>> to timeout = 1. It's the intention of RTDM to keep the semantic
>>> consistent over all platforms.
>> 
>> Is a negative timeout meant as sem_trywait _ALWAYS_?
> 
> Yep, that's what I tried to express. Not that clearly only in the
> sentence above, but in combination with the parameter list: 
> 
> "@param[in] timeout Relative timeout in nanoseconds, 0 for infinite, or
>  any negative value for non-blocking operation" 
> 
> The same goes for mutexes and events, BTW. But events already look
> correct, and mutexes will be fixed automatically when changing semaphores.

Then it should be OK as it is in vulcano CVS now. 

Paolo. 



-------------------------------------------------------------------------
Using Tomcat but need to do more? Need to support web services, security?
Get stuff done quickly with pre-integrated technology to make your job easier
Download IBM WebSphere Application Server v.1.0.1 based on Apache Geronimo
http://sel.as-us.falkag.net/sel?cmd=lnk&kid=120709&bid=263057&dat=121642
_______________________________________________
RTnet-users mailing list
RTnet-users@lists.sourceforge.net
https://lists.sourceforge.net/lists/listinfo/rtnet-users

Reply via email to