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, 30 Apr 2018 15:03:40 +0200 Organization: Aioe.org NNTP Server Message-ID: References: <3b736ddf-0807-4781-a973-6164280faae7@googlegroups.com> NNTP-Posting-Host: kQkuQcRDy1QFvWpyB1foYw.user.gioia.aioe.org Mime-Version: 1.0 Content-Type: text/plain; charset=utf-8; format=flowed Content-Transfer-Encoding: 7bit X-Complaints-To: abuse@aioe.org User-Agent: Mozilla/5.0 (Windows NT 10.0; WOW64; rv:52.0) Gecko/20100101 Thunderbird/52.7.0 X-Notice: Filtered by postfilter v. 0.8.3 Content-Language: en-US Xref: reader02.eternal-september.org comp.lang.ada:51832 Date: 2018-04-30T15:03:40+02:00 List-Id: On 2018-04-30 14:27, AdaMagica wrote: > Am Sonntag, 29. April 2018 21:36:37 UTC+2 schrieb Dmitry A. Kazakov: >> On 2018-04-29 19:41, AdaMagica wrote: >>> Am Samstag, 28. April 2018 10:35:34 UTC+2 schrieb Dmitry A. Kazakov: >>> >>>> All these instances *must* be finalized: X of T1 <- T2 <- T3 must be >>>> finalized in the order >>>> >>>> Finalize (T1'Class (X)); >>>> Finalize (T2'Class (X)); >>>> Finalize (T3'Class (X)); >>> I don't have the slightest idea what should happen there. >> >> Anything necessary to finalize the class-wide object. E.g. informing a >> task component to complete: > > What is this "anything"? Anything the program logic requires for a class-wide finalization to be done. > I do not see a connection from class-wide type to its task components. What is the connection of class-wide type to other components? What's the difference between task components and other (perhaps limited) components? What does class-wide finalize do to those other components? The reason why the object's type-specific finalization waits for all component tasks to complete do not apply to class-wide finalization of the same object. When you have a task component with a Rosen's trick access discriminant T1'Class in the object of T1, without waiting for the task, you may finalize T3 and T2 and have the task running with a T1'Class object partially finalized. This is why the task must complete *before* finalization of T1, T2, T3 etc. There is no problem not to wait for the task during finalization of T1'Class because at this point T1, T2, T3 views of the object are all intact. You can safely dispatch on the task discriminant to any target type. From T1'Class finalization will shutdown the task and everything will be fine, deadlock broken. Similarly. Let the design require calling an abstract or overridden operation upon finalization via dispatch. You cannot do that in the Finalize of T1. The reason is exactly same as with the task completion: the object is partially finalized in the type T3 where dispatch may lead to. But you can safely dispatch in the Finalize of T1'Class, because T3 view is still there. > In short: If you look inside a class-wide object, you'll find inside an object of a specific type within this class (as Randy said in a previous post). What's the property of this specific object seen as a class-wide object that's not a property of the specific object? Simple. All properties of the class, overridden operations, in particular. Primitive operations dispatch on a class-wide object, they do not on a type-specific object. -- Regards, Dmitry A. Kazakov http://www.dmitry-kazakov.de