Problem when suspending a task.

Nick Thomas nick.thomas at pixsan.com
Thu Jan 7 12:26:44 UTC 2010



> -----Original Message-----
> From: Leon Pollak [mailto:leonp at plris.com]
> Sent: 07 January 2010 10:27
> To: "Undisclosed.Recipients:"@plris.com
> Cc: Nick Thomas
> Subject: Re: Problem when suspending a task.
> 
> On Thursday January 7 2010, Nick Thomas wrote:
> > I presume that it is safe for task 'X' to suspend task 'Y' when 'Y'
> is
> > asleep, or waiting on a message Q.
> > And possibly when waiting on a semaphore.
> > So, is it possible to obtain the state of the task to be suspended,
> > and if it's in one of those states then I can suspend it.
> > I see that the task state is listed in the monitor 'task' command,
> but
> > this code is in RTEMS, and I can't see an obvious rtems_task_xxx API
> > call to obtain this info. Is there one?
> Yes, this may be a way, although too complicated.
> 
> May be you will consider the simpler decision: when you want to suspend
> from task A task B set some flag variable in A, while B will test this
> flag and suspend itself when not in a dangerous region.

OK, I understand that. And it seems like the best approach.
But, in an effort to not disrupt code common with other non-rtems projects,
I don't want to mess about with the tasks code too much. And there are lots
of them.
But, the OS API is abstracted, so if I can do it with my initial method then
it won't impact on other projects/products at all.
I have seen the use of rtems_iterate_over_all_threads API, and this appears
to work well enough for me.
I just need to be sure that I can suspend the task when it is in a 'safe'
state.

I have tested the two below, and that works. But, which of the others are
'safe'.
I notice that a task could be in the 'READY' state quite a lot, is it safe
to suspend the task when 'READY'?

#define STATES_READY                           0x00000 
#define STATES_DORMANT                         0x00001 
#define STATES_SUSPENDED                       0x00002 
#define STATES_TRANSIENT                       0x00004 
#define STATES_DELAYING                        0x00008 /* OK */
#define STATES_WAITING_FOR_TIME                0x00010 
#define STATES_WAITING_FOR_BUFFER              0x00020
#define STATES_WAITING_FOR_SEGMENT             0x00040
#define STATES_WAITING_FOR_MESSAGE             0x00080 /* OK */
#define STATES_WAITING_FOR_EVENT               0x00100
#define STATES_WAITING_FOR_SEMAPHORE           0x00200
#define STATES_WAITING_FOR_MUTEX               0x00400
#define STATES_WAITING_FOR_CONDITION_VARIABLE  0x00800
#define STATES_WAITING_FOR_JOIN_AT_EXIT        0x01000
#define STATES_WAITING_FOR_RPC_REPLY           0x02000
#define STATES_WAITING_FOR_PERIOD              0x04000
#define STATES_WAITING_FOR_SIGNAL              0x08000

> 
> BR
> --
> Leon
> --
>             Dr.Leon M.Pollak
>                 Director
>        PLR Information Systems Ltd.
> Tel.:+972-98657670  |  POB 8130, H'Aomanut 9,
> Fax.:+972-98657621  |  Poleg Industrial Zone,
> Mob.:+972-544739246 |  Netanya, 42160, Israel.




More information about the users mailing list