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: Mon, 16 Apr 2018 17:26:41 +0200 Organization: Aioe.org NNTP Server Message-ID: References: <702e2422-a93f-4200-9749-5122c3d0f899@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:51546 Date: 2018-04-16T17:26:41+02:00 List-Id: On 16/04/2018 10:32, J-P. Rosen wrote: > Le 16/04/2018 à 10:13, Dmitry A. Kazakov a écrit : >> You would terminate descendants (grandchildren) from the rendezvous with >> the child's Terminate: >> >>    select >>       ... >>    or terminate >>       do -- Hidden rendezvous body >>         ... terminate all descendants >>       end Terminate; >>    else >>       ... spawn new descendants >>    end select; > That's not what I mean. If you have both "terminate" and "select", if > you select "terminate" (and all children are on a select with > terminate), then you can terminate and you were right to select that > branch. But if you select "else", then you can wake up other tasks that > might in turn call your entries, so you were right not to select > "terminate". That's what I call undecidable. OK, but why should I care? Once termination is engaged, the task must become not callable (which seems the case by GNAT) and any call from any child would fail, which should allow terminating them. >>>> Anyway since T'Callable seems working, there is no need to use the >>>> terminate alternative ever. >>>> >>> No, T'Callable becomes false AFTER the terminate has been selected. >> >> 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. The only place RM explains 'Callable is in ARM C.7.1:riddle: "(10.a.1/1):Ramification: {8652/0115} {AI95-00206-01} These routines can be called with an argument identifying the environment task. Is_Terminated will always be False for such a call, but Is_Callable (usually True) could be False if the environment task is waiting for the termination of dependent tasks. Thus, a dependent task can use Is_Callable to determine if the main subprogram has completed." At least for the environment task 'Callable is defined this (reasonable) way. It seems that GNAT uses this definition for all task. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de