From: "Randy Brukardt" <randy@rrsoftware.com>
Subject: Re: Class with task destructor
Date: Wed, 30 Nov 2011 18:35:13 -0600
Date: 2011-11-30T18:35:13-06:00 [thread overview]
Message-ID: <jb6i43$58u$1@munin.nbi.dk> (raw)
In-Reply-To: ey516bovprzb$.1tjszfc528chj$.dlg@40tude.net
"Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> wrote in message
news:ey516bovprzb$.1tjszfc528chj$.dlg@40tude.net...
> On Tue, 29 Nov 2011 18:21:51 -0800 (PST), Adam Beneschan wrote:
...
>> I don't know of a good way
>> around this (besides Ada.Task_Termination).
>
> I am using polling for T'Terminated after the rendezvous.
That's the Ada 83 solution, and there really isn't anything better in the
language. Not sure if there even could be (I'm not a top-level expert on
real-time issues, beyond what the Janus/Ada runtime does).
...
> Not a feature, rather a plain language design bug. Unchecked_Deallocation
> shall wait for the object's finalization. Finalization of a task evidently
> includes its termination. So Unchecked_Deallocation must block until
> termination before it frees anything.
The problem here is that finalization and task termination are different
operations according to the language, and task termination generally has to
be done first. This was done, I believe, so that any running task does not
have to worry about having the objects it accesses finalized.
I usually agree that this is wrong, but actually it doesn't matter what
choice is made -- any choice will be wrong a large part of the time. The
current choice, for instance, makes it possible for finalize routines to
access objects that have already been finalized (and allocate objects of
access types that already have been finalized) - a finalize routine often
needs to protect against this if it needs to access anything outside of the
object being finalized.
We had a lot of trouble with this in Claw, particularly because we wanted to
use a global finalizable object to tell the library tasks when to terminate.
But that doesn't work in Ada, because tasks are awaited before any
library-level finalization is done -- and thus the tasks never get their
shutdown entries called. We eventually found a tricky way to use
Ada.Task_Identification to determine when the main subprogram has exited,
and used that to terminate the tasks. (And then we had to get all of the Ada
95 compilers to implement it properly -- that took a couple of years and an
ACATS test.)
Switching the order of task waiting and finalization would have worked in
this case, but it wouldn't work in general as the library tasks would then
be accessing global objects that have been finalized. Which seems worse than
the original problem.
Point is that all of these things are interelated, and it isn't always
possible to make all of them perfect. (Tucker Taft calls this "moving the
bump under the carpet"; you can move it around to different locations, but
you can't get rid of it without tearing out the carpet. That happens a lot
more often in language design than most people think.)
Randy.
next prev parent reply other threads:[~2011-12-01 0:36 UTC|newest]
Thread overview: 50+ messages / expand[flat|nested] mbox.gz Atom feed top
2011-11-23 1:50 Class with task destructor Rego, P.
2011-11-23 2:44 ` Adam Beneschan
2011-11-23 5:04 ` Yannick Duchêne (Hibou57)
2011-11-23 6:14 ` Adam Beneschan
2011-11-24 0:15 ` Randy Brukardt
2011-11-24 2:48 ` Adam Beneschan
2011-11-29 3:36 ` Randy Brukardt
2011-11-29 9:31 ` Simon Wright
2011-11-29 15:37 ` Adam Beneschan
2011-11-23 8:35 ` Dmitry A. Kazakov
2011-11-23 9:05 ` Simon Wright
2011-11-23 10:41 ` Dmitry A. Kazakov
2011-11-30 1:11 ` Rego, P.
2011-11-30 2:21 ` Adam Beneschan
2011-11-30 8:41 ` Dmitry A. Kazakov
2011-12-01 0:35 ` Randy Brukardt [this message]
2011-12-01 6:28 ` J-P. Rosen
2011-12-01 10:55 ` Simon Wright
2011-12-01 21:48 ` Robert A Duff
2011-12-01 22:44 ` Adam Beneschan
2011-12-02 0:57 ` Randy Brukardt
2011-12-02 5:57 ` J-P. Rosen
2011-12-02 15:07 ` Robert A Duff
2011-12-02 18:41 ` Jeffrey Carter
2011-12-01 9:25 ` Dmitry A. Kazakov
2011-12-01 1:58 ` Rego, P.
2011-11-30 8:35 ` Simon Wright
2011-11-30 15:36 ` Adam Beneschan
2011-11-30 16:32 ` Robert A Duff
2011-12-01 0:40 ` Randy Brukardt
2011-12-01 8:50 ` Yannick Duchêne (Hibou57)
2011-12-02 0:50 ` Randy Brukardt
2011-12-02 5:30 ` Jeffrey Carter
2011-12-02 16:20 ` Adam Beneschan
2011-12-02 18:01 ` Dmitry A. Kazakov
2011-12-02 18:50 ` Jeffrey Carter
2011-12-02 19:03 ` Adam Beneschan
2011-12-01 10:51 ` Simon Wright
2011-12-01 22:59 ` Simon Wright
2011-12-01 1:59 ` Rego, P.
2011-11-30 1:47 ` Rego, P.
[not found] ` <15090042.1880.1322617401962.JavaMail.geo-discussion-forums@yqkn8>
2011-11-30 8:43 ` Dmitry A. Kazakov
2011-12-01 1:53 ` Rego, P.
2011-12-01 9:28 ` Dmitry A. Kazakov
2011-11-25 2:44 ` Rego, P.
[not found] ` <28489797.1088.1322188495508.JavaMail.geo-discussion-forums@yqf20>
2011-11-25 9:19 ` Dmitry A. Kazakov
2011-11-29 3:40 ` Randy Brukardt
2011-11-23 10:26 ` Brian Drummond
2011-11-25 1:37 ` Rego, P.
2011-11-25 13:40 ` Brian Drummond
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox