Ada_Ru форум

Обсуждение языка Ада

Some problem with "abort"

Оставить новое сообщение

Сообщения

KsiCom
Some problem with "abort"
2006-07-10 08:13:29

Есть две тривиальные программы:

 

Программа1:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is

task Task1 is

entry Stop;

end Task1;

task body Task1 is

begin

accept Stop;

end Task1;

begin

Put_Line ( "Please wait..." );

Delay 3.0;

abort Task1;

Put_Line ( "Task Task1 Aborted!" );

end main;

 

 

Всё прекрасно работает. После запуска проходит 3 секунды, !Программа! завершает свою работу.

 

Программа2:

with Ada.Text_IO; use Ada.Text_IO;

procedure Main is

task Task1;

task body Task1 is

begin

loop

null;

end loop;

end Task1;

begin

Put_Line ( "Please wait..." );

Delay 3.0;

abort Task1;

Put_Line ( "Task Task1 Aborted!" );

end main;

 

 

Проходит 3 секунды. Выдаётся сообщение Task Task1 Aborted и !Программа! продолжает "работать" пока не нажму Ctrl+C.

 

Система:

CentOS4.3 ( клон RHEL4U3 )

GNAT 3.4.5 ( Red Hat 3.4.5-2 )

GCC 3.4.5 ( Red Hat 3.4.5-2 )

 

В чём может быть дело? По идее обе программы должны штатно завершаться...

А что нибудь поконкретнее чем null в цикл прописать не пробовали ?

KsiCom wrote:

Dmitriy Anisimkov wrote:

 

А что нибудь поконкретнее чем null в цикл прописать не пробовали ?

 

Похоже, именно тут собака и порылась. Поскольку уже вот такое вот

успешно завершается:

 

with Ada.Text_IO; use Ada.Text_IO;

procedure Main2 is

task Task1;

task body Task1 is

begin

loop

Put_Line ("task1 - working...");

end loop;

end Task1;

begin

Put_Line ( "Please wait..." );

Delay 3.0;

abort Task1;

Put_Line ( "Task Task1 Aborted!" );

end main2;

KsiCom wrote:

 

В чём может быть дело? По идее обе программы должны штатно завершаться...

 

Именно так. И поэтому имеет смысл отправить жалобу разработчикам.

Именно так. И поэтому имеет смысл отправить жалобу разработчикам.

У меня похожая проблема была с примерно таким кодом

 

task body Task1 is

begin

loop

delay 5.0;

Do_Somesing;

end loop;

end Task1;

 

и вырубить такую задачу когда она была в спячке было тоже

проблематично, видимо пока задача "варится в собственном соку" без

каких бы то нибыло действий "наружу" вырубать ее неполучается,

почемуто.

Andry Ogorodnik wrote:

 

>Именно так. И поэтому имеет смысл отправить жалобу разработчикам.

 

>У меня похожая проблема была с примерно таким кодом

 

task body Task1 is

begin

loop

delay 5.0;

Do_Somesing;

end loop;

end Task1;

 

>и вырубить такую задачу когда она была в спячке было тоже

>проблематично, видимо пока задача "варится в собственном соку" без >каких бы то нибыло действий "наружу" вырубать ее неполучается,

>почемуто.

 

 

Если эта проблема была не в виндах, то это проблема, а если в виндах, надо пробовать компилировать с ключом -gnatP

см. пример http://www.ada-ru.org/smpl-astr.html

On Wed, Jul 12, 2006 at 11:29:28AM +0400, Sergey I. Rybin wrote:

KsiCom wrote:

 

В чём может быть дело? По идее обе программы должны штатно завершаться...

 

Именно так. И поэтому имеет смысл отправить жалобу разработчикам.

 

Странно, я думал RM этого не требует. Что задача может НЕ завершаться пока не достигнет следующей abort completion points:

 

However, the execution of the aborted construct completes no later than its next abort completion point (if any) that occurs outside of an abort-deferred operation; the following are abort completion points for an execution:

16

 

* the point where the execution initiates the activation of another * task;

 

17

 

* the end of the activation of a task;

 

18

 

* the start or end of the execution of an entry call,

* accept_statement, delay_statement, or abort_statement;

 

19

 

* the start of the execution of a select_statement, or of the * sequence_of_statements of an exception_handler.

 

 

--

Maxim Reznik

Новое сообщение:
Страницы: 1

Чтобы оставить новое сообщение необходимо Зарегистрироваться и Войти