All of lore.kernel.org
 help / color / mirror / Atom feed
* [Xenomai-help] rt_task_delete trouble
@ 2011-03-11  8:28 Johann Obermayr
  2011-03-11  8:51 ` Gilles Chanteperdrix
  0 siblings, 1 reply; 9+ messages in thread
From: Johann Obermayr @ 2011-03-11  8:28 UTC (permalink / raw)
  To: xenomai

[-- Attachment #1: Type: text/plain, Size: 3527 bytes --]

Hello,

i'm a newbie with xenomai.
My problem is, if a rt task will delete with rt_task_delete, than
the progam hangs.

here is my sample
----------------------------------
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <sys/mman.h>

#include <native/mutex.h>
#include <native/task.h>
#include <native/types.h>

#include <rtdk.h>

RT_TASK task_waiter, task_worker;

volatile int task_waiter_flag = 0;

#define DELAYS(x)        (x * 1000 * 1000 * 1000)
#define DELAYMS(x)        (x * 1000 * 1000)

void delaysec(unsigned int sec)
{
     RTIME delay = DELAYS(sec);
     rt_task_sleep( delay );
}

void task_waiter_do(void *data)
{
     rt_printf("task_waiter_do started\n");
     while(task_waiter_flag == 0)
         ; // rt_task_sleep( DELAYMS(1) );
     rt_printf("task_waiter_do finished\n");
}

void task_worker_do(void *data)
{
     int rval;
     rt_printf("task_worker_do started\n");
     delaysec(1);
     rt_printf("task_worker_do suspend waiter\n");
     rval = rt_task_suspend(&task_waiter);
     rt_printf("task_worker_do suspend:%d\n", rval);
     delaysec(1);
     rt_printf("task_worker_do delete waiter\n");
     rval = rt_task_delete(&task_waiter);
     rt_printf("task_worker_do delete:%d\n", rval);
     delaysec(1);
     while(task_waiter_flag == 0)
         rt_task_sleep( DELAYMS(10) );
     rt_printf("task_worker_do finished\n");
}

int main(int argc, char **argv)
{
     int rval;

     mlockall(MCL_CURRENT|MCL_FUTURE);

     printf("Starting\n");
     rt_print_auto_init(1);

     rval = rt_task_create(&task_worker, "worker", 0, 80, 0);
     if (rval == 0) {
         rval = rt_task_create(&task_waiter, "waiter", 0, 30, 0);

         rval = rt_task_start(&task_worker, &task_worker_do, NULL);
         if (rval == 0) {
             rval = rt_task_start(&task_waiter, &task_waiter_do, NULL);
             if (rval == 0) {

                 printf("Working\n");
             }
             else
                 rt_printf("rt_task_suspend failed(%d)", rval);
         }
         else
             rt_printf("rt_task_start failed(%d)", rval);
     }
     else
         rt_printf("rt_task_create failed(%d)", rval);


     printf("Finsihed <press any key>\n");
     getchar();
     task_waiter_flag = 1;
     usleep(100000);
     return 0;
}
----------------------------------
the task task_worker_do will hang after rt_task_delete. Why ?
if i add a sleep into task_waiter_do, the sample work correct.
What can i do, to solve this.

   Thanks
     greetings
       Johann

-- 
Mit freundlichen Grüßen, best regards
     Johann Obermayr

Software Entwicklung
________________________________________________
SIGMATEK GmbH&  Co KG
Sigmatekstraße 1
5112 Lamprechtshausen
Österreich / Austria

Tel.  :  +43 / 6274/ 43 21-0   (Durchwahl leider nicht möglich)
Fax   :  +43 / 6274/ 43 21-18  (bzw 300 im Werk 2 )
E-Mail:johann.obermayr@domain.hid
http://www.sigmatek-automation.com
****************************Please note:********************************
  This email and all attachments are confidential and intended solely for
  the person or entity to whom it is addressed. If you are not the named
  addressee you must not make this email and all attachments accessible
  to any other person. If you have received this email in error please
  delete it together with all attachments.
************************************************************************


[-- Attachment #2: Type: text/html, Size: 5267 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:28 [Xenomai-help] rt_task_delete trouble Johann Obermayr
@ 2011-03-11  8:51 ` Gilles Chanteperdrix
  2011-03-11  8:58   ` Jan Kiszka
                     ` (2 more replies)
  0 siblings, 3 replies; 9+ messages in thread
From: Gilles Chanteperdrix @ 2011-03-11  8:51 UTC (permalink / raw)
  To: johann.obermayr; +Cc: xenomai

Johann Obermayr wrote:
> void task_waiter_do(void *data)
> {
>      rt_printf("task_waiter_do started\n");
>      while(task_waiter_flag == 0)
>          ; // rt_task_sleep( DELAYMS(1) );
>      rt_printf("task_waiter_do finished\n");
> }

What happens if you uncomment the rt_task_sleep here ?

Could you please give us some more information:
http://www.xenomai.org/index.php/Request_for_information

Do you have priority coupling enabled?

-- 
					    Gilles.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:51 ` Gilles Chanteperdrix
@ 2011-03-11  8:58   ` Jan Kiszka
  2011-03-11  9:06     ` Gilles Chanteperdrix
  2011-03-11  9:59     ` Johann Obermayr
  2011-03-11  9:52   ` Johann Obermayr
  2011-03-11 10:59   ` Johann Obermayr
  2 siblings, 2 replies; 9+ messages in thread
From: Jan Kiszka @ 2011-03-11  8:58 UTC (permalink / raw)
  To: Gilles Chanteperdrix; +Cc: xenomai

[-- Attachment #1: Type: text/plain, Size: 468 bytes --]

On 2011-03-11 09:51, Gilles Chanteperdrix wrote:
> Johann Obermayr wrote:
>> void task_waiter_do(void *data)
>> {
>>      rt_printf("task_waiter_do started\n");
>>      while(task_waiter_flag == 0)
>>          ; // rt_task_sleep( DELAYMS(1) );
>>      rt_printf("task_waiter_do finished\n");
>> }
> 
> What happens if you uncomment the rt_task_sleep here ?
> 

Given how often users make this mistake, should we enable the watchdog
by default?

Jan


[-- Attachment #2: OpenPGP digital signature --]
[-- Type: application/pgp-signature, Size: 259 bytes --]

^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:58   ` Jan Kiszka
@ 2011-03-11  9:06     ` Gilles Chanteperdrix
  2011-03-11  9:59     ` Johann Obermayr
  1 sibling, 0 replies; 9+ messages in thread
From: Gilles Chanteperdrix @ 2011-03-11  9:06 UTC (permalink / raw)
  To: Jan Kiszka; +Cc: xenomai

Jan Kiszka wrote:
> On 2011-03-11 09:51, Gilles Chanteperdrix wrote:
>> Johann Obermayr wrote:
>>> void task_waiter_do(void *data)
>>> {
>>>      rt_printf("task_waiter_do started\n");
>>>      while(task_waiter_flag == 0)
>>>          ; // rt_task_sleep( DELAYMS(1) );
>>>      rt_printf("task_waiter_do finished\n");
>>> }
>> What happens if you uncomment the rt_task_sleep here ?
>>
> 
> Given how often users make this mistake, should we enable the watchdog
> by default?

>From my point of view, however strange this example is, it should work
with root thread priority coupling enabled.
-- 
					    Gilles.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:51 ` Gilles Chanteperdrix
  2011-03-11  8:58   ` Jan Kiszka
@ 2011-03-11  9:52   ` Johann Obermayr
  2011-03-11  9:56     ` Gilles Chanteperdrix
  2011-03-11 13:13     ` Gilles Chanteperdrix
  2011-03-11 10:59   ` Johann Obermayr
  2 siblings, 2 replies; 9+ messages in thread
From: Johann Obermayr @ 2011-03-11  9:52 UTC (permalink / raw)
  To: gilles.chanteperdrix; +Cc: xenomai

Am 11.03.2011 09:51, schrieb Gilles Chanteperdrix:
> Johann Obermayr wrote:
>> void task_waiter_do(void *data)
>> {
>>       rt_printf("task_waiter_do started\n");
>>       while(task_waiter_flag == 0)
>>           ; // rt_task_sleep( DELAYMS(1) );
>>       rt_printf("task_waiter_do finished\n");
>> }
> What happens if you uncomment the rt_task_sleep here ?
we have some shared code from another RT OS.
And in this code there are some while(hw_state) ;  loops.

> Could you please give us some more information:
> http://www.xenomai.org/index.php/Request_for_information
>
> Do you have priority coupling enabled?
Yes.


We use xenomai 2.5.5.2 and linux kernel 2.6.32.15. gcc 4.3.3

Here you have some more details.
a kernel module have a watchdog checker for some 'user-tasks'
if a 'user-task' have a while loop, than the kernel module will suspend
the user-task and call also the mayday function.

But on some other errorhandling, we have a high priortity watchdog task 
control the 'user'-tasks.
On error the watchdog task suspend all user-tasks. (this work correct)
Than the watchdog-task switch off the user-task watchdog.
Make errorhandling and some other function (dump user-task stack)
Than the watchdog task will delete some user-task.
But if a user-task is in a while loop, the system hangs.
in user mode we have no mayday function.
it's look like, that when watchdog-task call rt_task_delete(user_task) , 
the user_task continue running.
Is this so ?

    Thanks
       Jimmy

-- 
Mit freundlichen Grüßen, best regards
     Johann Obermayr

Software Entwicklung
________________________________________________
SIGMATEK GmbH&  Co KG
Sigmatekstraße 1
5112 Lamprechtshausen
Österreich / Austria

Tel.  :  +43 / 6274/ 43 21-0   (Durchwahl leider nicht möglich)
Fax   :  +43 / 6274/ 43 21-18  (bzw 300 im Werk 2 )
E-Mail: johann.obermayr@domain.hid
http://www.sigmatek-automation.com
****************************Please note:********************************
  This email and all attachments are confidential and intended solely for
  the person or entity to whom it is addressed. If you are not the named
  addressee you must not make this email and all attachments accessible
  to any other person. If you have received this email in error please
  delete it together with all attachments.
************************************************************************



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  9:52   ` Johann Obermayr
@ 2011-03-11  9:56     ` Gilles Chanteperdrix
  2011-03-11 13:13     ` Gilles Chanteperdrix
  1 sibling, 0 replies; 9+ messages in thread
From: Gilles Chanteperdrix @ 2011-03-11  9:56 UTC (permalink / raw)
  To: johann.obermayr; +Cc: xenomai

Johann Obermayr wrote:
> Am 11.03.2011 09:51, schrieb Gilles Chanteperdrix:
>> Johann Obermayr wrote:
>>> void task_waiter_do(void *data)
>>> {
>>>       rt_printf("task_waiter_do started\n");
>>>       while(task_waiter_flag == 0)
>>>           ; // rt_task_sleep( DELAYMS(1) );
>>>       rt_printf("task_waiter_do finished\n");
>>> }
>> What happens if you uncomment the rt_task_sleep here ?
> we have some shared code from another RT OS.
> And in this code there are some while(hw_state) ;  loops.

I just ask you to uncomment this line and run the test to see if it
changes anything. We are in the process of trying and understanding the
issue here... not fixing anything yet.

But from a general point of vieuw, code with unbounded busy waits with
Xenomai will not fly for other reasons.

-- 
					    Gilles.


^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:58   ` Jan Kiszka
  2011-03-11  9:06     ` Gilles Chanteperdrix
@ 2011-03-11  9:59     ` Johann Obermayr
  1 sibling, 0 replies; 9+ messages in thread
From: Johann Obermayr @ 2011-03-11  9:59 UTC (permalink / raw)
  To: jan.kiszka; +Cc: xenomai

Am 11.03.2011 09:58, schrieb Jan Kiszka:
> On 2011-03-11 09:51, Gilles Chanteperdrix wrote:
>> Johann Obermayr wrote:
>>> void task_waiter_do(void *data)
>>> {
>>>       rt_printf("task_waiter_do started\n");
>>>       while(task_waiter_flag == 0)
>>>           ; // rt_task_sleep( DELAYMS(1) );
>>>       rt_printf("task_waiter_do finished\n");
>>> }
>> What happens if you uncomment the rt_task_sleep here ?
>>
> Given how often users make this mistake, should we enable the watchdog
> by default?
>
> Jan
>
We have a watchdog, and your watchdod-task suspend the user-task 
(task_waiter_do).
the sample show this problem.
The task_worker_do is a watchdog. he control some other 'user-task'.
In your project, the watchdog startup the watchdog-task.
the task_worker_do suspend the user-task.
the task_worker_do will delete the user-task.

if the user-task have only while(1); than the machine will hang.
if the user-task have in the while a sleep or other function,
the task_worker_do can delete the task_waiter, and all work correct.

   Jimmy

-- 
Mit freundlichen Grüßen, best regards
     Johann Obermayr

Software Entwicklung
________________________________________________
SIGMATEK GmbH&  Co KG
Sigmatekstraße 1
5112 Lamprechtshausen
Österreich / Austria

Tel.  :  +43 / 6274/ 43 21-0   (Durchwahl leider nicht möglich)
Fax   :  +43 / 6274/ 43 21-18  (bzw 300 im Werk 2 )
E-Mail: johann.obermayr@domain.hid
http://www.sigmatek-automation.com
****************************Please note:********************************
  This email and all attachments are confidential and intended solely for
  the person or entity to whom it is addressed. If you are not the named
  addressee you must not make this email and all attachments accessible
  to any other person. If you have received this email in error please
  delete it together with all attachments.
************************************************************************



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  8:51 ` Gilles Chanteperdrix
  2011-03-11  8:58   ` Jan Kiszka
  2011-03-11  9:52   ` Johann Obermayr
@ 2011-03-11 10:59   ` Johann Obermayr
  2 siblings, 0 replies; 9+ messages in thread
From: Johann Obermayr @ 2011-03-11 10:59 UTC (permalink / raw)
  To: gilles.chanteperdrix; +Cc: xenomai

Am 11.03.2011 09:51, schrieb Gilles Chanteperdrix:
> Johann Obermayr wrote:
>> void task_waiter_do(void *data)
>> {
>>       rt_printf("task_waiter_do started\n");
>>       while(task_waiter_flag == 0)
>>           ; // rt_task_sleep( DELAYMS(1) );
>>       rt_printf("task_waiter_do finished\n");
>> }
> What happens if you uncomment the rt_task_sleep here ?
it work correct, if rt_task_sleep is uncommented.

> Could you please give us some more information:
> http://www.xenomai.org/index.php/Request_for_information
>
> Do you have priority coupling enabled?
Yes.

   Jimmy

-- 
Mit freundlichen Grüßen, best regards
     Johann Obermayr

Software Entwicklung
________________________________________________
SIGMATEK GmbH&  Co KG
Sigmatekstraße 1
5112 Lamprechtshausen
Österreich / Austria

Tel.  :  +43 / 6274/ 43 21-0   (Durchwahl leider nicht möglich)
Fax   :  +43 / 6274/ 43 21-18  (bzw 300 im Werk 2 )
E-Mail: johann.obermayr@domain.hid
http://www.sigmatek-automation.com
****************************Please note:********************************
  This email and all attachments are confidential and intended solely for
  the person or entity to whom it is addressed. If you are not the named
  addressee you must not make this email and all attachments accessible
  to any other person. If you have received this email in error please
  delete it together with all attachments.
************************************************************************



^ permalink raw reply	[flat|nested] 9+ messages in thread

* Re: [Xenomai-help] rt_task_delete trouble
  2011-03-11  9:52   ` Johann Obermayr
  2011-03-11  9:56     ` Gilles Chanteperdrix
@ 2011-03-11 13:13     ` Gilles Chanteperdrix
  1 sibling, 0 replies; 9+ messages in thread
From: Gilles Chanteperdrix @ 2011-03-11 13:13 UTC (permalink / raw)
  To: johann.obermayr; +Cc: xenomai

Johann Obermayr wrote:
> We use xenomai 2.5.5.2 and linux kernel 2.6.32.15. gcc 4.3.3
> 
> Here you have some more details.
> a kernel module have a watchdog checker for some 'user-tasks'
> if a 'user-task' have a while loop, than the kernel module will suspend
> the user-task and call also the mayday function.
> 
> But on some other errorhandling, we have a high priortity watchdog task 
> control the 'user'-tasks.
> On error the watchdog task suspend all user-tasks. (this work correct)
> Than the watchdog-task switch off the user-task watchdog.
> Make errorhandling and some other function (dump user-task stack)
> Than the watchdog task will delete some user-task.
> But if a user-task is in a while loop, the system hangs.
> in user mode we have no mayday function.

>From my point of view, you should be using the watchdog provided by
Xenomai. Did you notice that in your application, you can register a
signal handler to handle the watchdog signal? This would allow you to
use the watchdog provided by Xenomai to handle tasks blocked in infinite
loops. Then use your watchdog to handle other cases.

See the example at examples/native/sigdebug.c

> it's look like, that when watchdog-task call rt_task_delete(user_task) , 
> the user_task continue running.
> Is this so ?

Yes, this is probably the reason. The thing is that the watchdog task
calling rt_task_delete calls pthread_cancel, which causes a switch to
secondary mode. What I do not understand, however, is that since you
have priority coupling enabled, it should work. So, I have to reproduce
this case to understand. But actually, now that I think about it,
Wolfgang signalled the same issue with pthread_cancel and the posix skin
a long time ago, I looked at it, and I seem to remember that after
investigation, it could not work.

-- 
					    Gilles.


^ permalink raw reply	[flat|nested] 9+ messages in thread

end of thread, other threads:[~2011-03-11 13:13 UTC | newest]

Thread overview: 9+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2011-03-11  8:28 [Xenomai-help] rt_task_delete trouble Johann Obermayr
2011-03-11  8:51 ` Gilles Chanteperdrix
2011-03-11  8:58   ` Jan Kiszka
2011-03-11  9:06     ` Gilles Chanteperdrix
2011-03-11  9:59     ` Johann Obermayr
2011-03-11  9:52   ` Johann Obermayr
2011-03-11  9:56     ` Gilles Chanteperdrix
2011-03-11 13:13     ` Gilles Chanteperdrix
2011-03-11 10:59   ` Johann Obermayr

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.