nieh@moose.steinmetz (nico nieh) (10/09/87)
I am writing a simulation program using Ada task facilities.
What I wanted to do is to be able to abort a task which
is activated by using the allocator.
The program segment looks like,
task type pool is
entry draw(which : out integer); -- contains an infinite loop
end
type t_pool is access pool;
pool_1 : t_pool;
pool_2 : pool;
begin
....
....
pool_1 := new pool;
...
...
abort pool_1;
However, both DEC/ADA and Verdix Ada compiler gave syntax error at the
abort statement.
According to the LRM,
abort_statement ::= ABORT task_name {,task_name};
the abort statement only takes task_names not pointers to task.
Is there any way to abort task pool_1 ?
Ko-Haw Nieh
General Electric Company
Corporate Research and Development
nieh@ge-crd.arpa
518-387-7431fitch@ada-uts (10/12/87)
By using ".all" you can refer to a task object via a pointer.
So you want to specify
abort POOL_1.all;
If, however, this task does have an infinite loop, your abort
may not help you, since an "aborted" task may not become
completed until it hits a syncronization point, e.g. an accept
statement. Better to remove the loop and using a less severe
method to stop the task.
Geoff Fitch
Intermetrics, Inc.
733 Concord Ave.
Cambridge, MA 02138jonab@CAM.UNISYS.COM (Jonathan P. Biggar) (10/12/87)
In article <7586@steinmetz.steinmetz.UUCP> nieh@moose.steinmetz (nico nieh) writes: task type pool is entry draw(which : out integer); -- contains an infinite loop end type t_pool is access pool; pool_1 : t_pool; begin pool_1 := new pool; abort pool_1; >Is there any way to abort task pool_1 ? The statement you need is: abort pool_1.all; The '.all' component refers to the entire object accessed by the access type. Jon Biggar jonab@cam.unisys.com
jb@rti.UUCP (Jeff Bartlett) (10/12/87)
How about abort task_1.all; since you wanted to stop what the pointer references not stop the pointer. Jeff Bartlett Research Triangle Institute jb@rti.rti.org mcnc!rti!jb
claudio@ethz.UUCP (Claudio Nieder) (10/12/87)
In article <7586@steinmetz.steinmetz.UUCP> nieh@moose.steinmetz (nico nieh) writes: >What I wanted to do is to be able to abort a task which >is activated by using the allocator. > >... the abort statement only takes task_names not pointers to task. So you have to dereference the pointer ... procedure TASK_REFERENCE is task type TASK_TYPE; type TASK_POINTER is access TASK_TYPE; TASK_INSTANCE : TASK_POINTER; task body TASK_TYPE is begin null; -- may be a never ending story ... end TASK_TYPE; begin TASK_INSTANCE := new TASK_TYPE; abort TASK_INSTANCE.all; end TASK_REFERENCE; ... and your program will be accepted by the compiler. Harry
murphy@beatnix.UUCP (Michael Murphy) (10/13/87)
You need to dereference the task access, e.g. abort pool_1.all; That way you are aborting the task rather than the access value. -- Michael P. Murphy -- UUCP: sun!elxsi!elky!murphy