From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=unavailable autolearn_force=no version=3.4.4 Path: eternal-september.org!reader01.eternal-september.org!reader02.eternal-september.org!feeder.eternal-september.org!aioe.org!.POSTED!not-for-mail From: "Dmitry A. Kazakov" Newsgroups: comp.lang.ada Subject: Re: Finalization of library level tasks Date: Tue, 17 Apr 2018 14:31:22 +0200 Organization: Aioe.org NNTP Server Message-ID: References: <702e2422-a93f-4200-9749-5122c3d0f899@googlegroups.com> <04f19a56-7fab-416e-8ec0-b9a73e239e90@googlegroups.com> NNTP-Posting-Host: MyFhHs417jM9AgzRpXn7yg.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 8bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 6.1; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 Content-Language: en-US X-Notice: Filtered by postfilter v. 0.8.3 Xref: reader02.eternal-september.org comp.lang.ada:51553 Date: 2018-04-17T14:31:22+02:00 List-Id: On 17/04/2018 11:51, AdaMagica wrote: > Am Montag, 16. April 2018 17:26:42 UTC+2 schrieb Dmitry A. Kazakov: >>>> So GNAT implementation is wrong and this one is illegal? >>>> >>>>    task body T is >>>>    begin >>>>       loop >>>>          exit when not T'Callable; >>>>          ... -- Do something >>>>       end loop; >>>>    end T; >>> I don't know what Gnat is doing, but while T is normally active, >>> T'Callable is True. This is clearly an infinite loop. >> >> It terminates under GNAT. Thus my question. > > As I understand RM 9.3, when this task T is going out of scope, i.e. if it is declared inside for instance in a block, the block can only be left when the task is completed (the block is the master, see 7.6.1), and I cannot see that the conditions on T to be completed can ever be fulfilled for T. Quite naturally, when the master is being finalized it marks the task as terminating and waits for its completion. The task marked for termination has T'Callable false and so terminates. > Thus the block cannot be left, the program is blocked. Gnat seems wrong to me. It would be an insane behavior. But that would not wonder me because rules are already insane, e.g. 7.6.1(4): "For the finalization of a master, dependent tasks are first awaited, as explained in 9.3. Then each object whose accessibility level is the same as that of the master is finalized if the object was successfully initialized and still exists." which is the reason why library-level task cannot be terminated using controlled objects. ------------------------------------------------------------ I thought about a method involving a helper task: Exiting : Boolean := False; type Exit_Event is new Ada.Finaization.Limited_Controlled with null record; procedure Finalize (X : in out Exit_Event) is begin Exiting := True; end Finalize; task Working_Around is entry Never_Entry; end Working_Around; task body Working_Around is X : Exit_Event; begin select accept Never_Entry; or terminate; end select; end Working; task body T is begin loop exit when not Exiting; ... -- Do something end loop; end T; I hoped that T'Callable, if defined meaningfully, could spare me this mess. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de