On Tue, 22 Apr 2008, Philippe Gerum wrote:

[snipping even more context]

>>> What's wrong with rt_task_suspend() ?
>>
>> The current loop code is something like
>>
>> void timerloop_task_proc(void *arg)
>> {
>>         int ret;
>>         int errors = 0;
>>         do{
>>                 do{
>>                         last_occured_alarm = last_alarm_set;
>>                         EnterMutex();
>>                         TimeDispatch();
>>                         LeaveMutex();
>>                 }while ((ret = rt_task_sleep_until(last_alarm)) == 0);
>>                 if (ret == -ETIMEDOUT){
>>                   printf("[TIMERLOOP] Total errors = %d, return code =
>> %d\n",++errors,ret);
>>                 }
>>         }while (!(stop_timer && ret == -EINTR));
>>         printf("End of TimerLoop, code %d, Total errors =
>> %d\n",ret,errors);
>> }
>>
>> I could modify that code and put something like
>> if (last_alarm == TIMEVAL_MAX) // Nothing else to do, sleep forever
>>   rt_task_suspend()
>> else
>>   rt_task_sleep_until(last_alarm)
>>
>> However, the one who wants to wake up this thread (e.g. for asking
>> this thread to stop) doesn't know in what state the timerthread is.
>> It seems clumsy to me if that the one who wants to wake up the thread
>> has to try _unblock() first, and the _resume()?
>>
>
> There has been a fair amount of misunderstanding. Past mails were apparently
> aiming at rt_task_sleep's behaviour (e.g. returning 0 on NULL delay etc.), but
> you actually care for rt_task_sleep_until, which is a totally different story
> (the subject line was right though).

Sorry about that, during the debugging I ended up playing around with
rt_task_sleep() to check if the overflow issues did occur there too.

> Handling the special TM_INFINITE value as a valid timeout value for
> rt_task_sleep_until would not introduce the flaws I was concerned about
> regarding rt_task_sleep. We would just change the behaviour when receiving 
> what
> used to be an utterly bugous date spec in the current implementation, and make
> it valid, which is ok -- i.e. I'm not particularly concerned by maintaining
> backward compatible behaviours when receiving utterly insane data specs like 
> "0"
> for an absolute date.
>
> If your loop was truly periodic, you could probably use rt_task_wait_period(),
> but I suspect last_alarm may not try to enforce a strictly periodic timeline, 
> right?
>
> The fact that we don't have any other blocking calls with absolute date specs 
> is
> bothering me actually, and 2.5 will probably see some extensions like
> rt_sem_p_until(), in order to address patterns of this kind.
>
> But well, back to rt_task_sleep_until, I see no reason not to handle the 
> corner
> case you described a bit more gracefully. So let's try the Klaas Amendment to
> the native API.

I *really* like the way that sounds ;-)

> Does the following work for you?

[snipped patch]

It does!  Tested on today's 2.4-branch on a 2.6.20.21-ipipe-1.12-03 kernel.
Any chance this could still be merged in the 2.4 series?

Thx for your patience!

Klaas


_______________________________________________
Xenomai-help mailing list
[email protected]
https://mail.gna.org/listinfo/xenomai-help

Reply via email to