From: usenet on
Suppose I have a multi-tasking system where different tasks may
execute a sequence like

P1(A,B);
P2(C,D);
P3(E,F);

and I want to make this sequence a critical section. What is the
typical Ada way to do this? Would I wrap P1, P2 and P3 in a protected
object and call as follows (perhaps creating a record to hold A..F to
make things a bit cleaner)?

PO.P(A,B,C,D,E,F);

Or if not that, what? Thanks.
From: John B. Matthews on
In article
<71385df3-5fec-49b9-9d7a-98cb95a346ed(a)n20g2000prc.googlegroups.com>,
usenet(a)scriptoriumdesigns.com wrote:

> Suppose I have a multi-tasking system where different tasks may
> execute a sequence like
>
> P1(A,B);
> P2(C,D);
> P3(E,F);
>
> and I want to make this sequence a critical section. What is the
> typical Ada way to do this? Would I wrap P1, P2 and P3 in a
> protected object and call as follows (perhaps creating a record to
> hold A..F to make things a bit cleaner)?
>
> PO.P(A,B,C,D,E,F);
>
> Or if not that, what? Thanks.

Looks like what it was designed for. See also,

<http://www.adaic.com/standards/95rat/RAThtml/rat95-p1-2.html#9>
<http://www.adaic.com/standards/05rat/html/Rat-5-3.html>

--
John B. Matthews
trashgod at gmail dot com
<http://sites.google.com/site/drjohnbmatthews>
From: Dmitry A. Kazakov on
On Sat, 3 Jul 2010 13:06:24 -0700 (PDT), usenet(a)scriptoriumdesigns.com
wrote:

> Suppose I have a multi-tasking system where different tasks may
> execute a sequence like
>
> P1(A,B);
> P2(C,D);
> P3(E,F);
>
> and I want to make this sequence a critical section. What is the
> typical Ada way to do this?

I depends on the nature of P1..P3

> Would I wrap P1, P2 and P3 in a protected
> object and call as follows (perhaps creating a record to hold A..F to
> make things a bit cleaner)?
>
> PO.P(A,B,C,D,E,F);
>
> Or if not that, what?

There are many ways and solutions, starting with better design. What are
A,B,C,D,E,F. They might be made objects or put into object maintaining
their invariants when accessed concurrently.

At the low level there are four major approaches:

1. Protected operation. Used when what you do is short and non-blocking.
E.g. P1 cannot do I/O.

2. Monitor task performing desired actions. This one can perform lengthy or
blocking operations.

3. Mutexes (implemented by a protected object, mutex holder is wrapped into
a controlled object). The mutex holder when constructed seizes the mutex
and releases it upon finalization. While the holder exists you execute the
desired actions.

4. Asynchronous monitor task. That is when you start actions entering a
rendezvous with the monitor. Then you leave the rendezvous and do something
else, while the monitor is busy executing the actions. Some time later you
engage another rendezvous to make sure that the monitor task finished the
work.

--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de