comp.lang.ada
 help / color / mirror / Atom feed
From: Robert A Duff <bobduff@shell01.TheWorld.com>
Subject: Re: task synchronization and activation
Date: 21 Feb 2005 16:55:57 -0500
Date: 2005-02-21T16:55:57-05:00	[thread overview]
Message-ID: <wcchdk54lxu.fsf@shell01.TheWorld.com> (raw)
In-Reply-To: id7cvc.igh.ln@hunter.axlog.fr

Jean-Pierre Rosen <rosen@adalog.fr> writes:

> Evangelista Sami a �crit :
> > Hello all
> > Why does a task have to wait that all the tasks it created are
> > activated before
> > executing? I am thinking of point 9.2.5 of the RM :
> > "The task that created the new tasks and initiated their activations
> > (the activator) is blocked until all of these activations complete
> > (successfully or not)."
> > I can understand that a master has to wait for the tasks he created
> > before finalizing since in the other case it could "free" some memory
> > needed by its children.
> > But i cannot see why this synchronisation after activation is
> > necessary. What is the technical reason?
> >
> It has to do with exceptions at elaboration.
> 
> When a task is started, it first elaborates its declarative part. If
> exceptions are raised during this elaboration, they cannot be handled by
> the task itself, therefore it is necessary to notify *someone*, and the
> obvious "someone" is the activator. However, we don't want to have
> asynchronous exceptions, therefore the activator has to wait that all
> subtasks are (correctly) activated.

I can believe that that was the reasoning of the Ada 83 designers.
But I still don't quite agree with it.

For one thing, if you want to handle exceptions in the decl part,
just change this:

    task body T is
        ... -- possible exception here?
    begin
        ...
    end T;

to this:

    task body T is
    begin
        declare
            ... -- possible exception here?
        begin
            ...
        end;
    exception
        ...
    end T;

and now the task can handle it (because it's no longer in the task's
declarative part).  So it's a case of "Doctor, it hurts when I...."
"So don't do that."  ;-)

For another thing, what about exceptions in the exception handler part
of a task?  Those can't be handled by the task either, so they get
dropped on the floor -- nobody gets notified.  And in this case,
there is no 100% reliable workaround -- you can wrap that handler
in another block statement with another handler, but then what about
the 'nother handler?  There's an infinite regress.  You could carefully
inspect the outermost handler of a task, and make sure it doesn't have
any bugs (good idea!) -- but it could still get Storage_Error.

- Bob



  reply	other threads:[~2005-02-21 21:55 UTC|newest]

Thread overview: 12+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2005-02-19 15:11 task synchronization and activation Evangelista Sami
2005-02-19 16:11 ` Martin Krischik
2005-02-19 18:11   ` Ed Falis
2005-02-19 20:05   ` Robert A Duff
2005-02-20 10:47     ` Martin Krischik
2005-02-21 19:25     ` Dmitry A. Kazakov
2005-02-21  8:50 ` Jean-Pierre Rosen
2005-02-21 21:55   ` Robert A Duff [this message]
2005-02-22  0:01     ` Randy Brukardt
2005-02-22  7:17     ` Jean-Pierre Rosen
2005-02-23  2:24       ` Robert A Duff
2005-02-23  7:58         ` Martin Krischik
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox