


                                                       Chapter 26
                                       THE CONDITIONAL RENDEZVOUS


IMPATIENT PROGRAMMING
_________________________________________________________________

Many times in your life you wish to do something but you decide
after trying for a short period of time, that it cannot be done,
so you change your mind and do something else.  This capability
must be available in a computer program also, since many times a
computer program is used to simulate something in real life.  This
chapter will give examples of impatient programs, those that refuse
to simply wait forever for a certain job to be done.


THE BASIC PROGRAM OUTLINE
_________________________________________________________________

Examine the file named MEALS1.ADA for the        ================
program that will serve as the outline for the      MEALS1.ADA
selective rendezvous even though it does not     ================
contain one.  The program consists of four
tasks, one each to describe Bill's day and
John's day, and one each to describe eating a meal at a restaurant
and at a fast food Burger Boy (hopefully not an actual restaurant).
In this program, all of the delay times have been defined in terms
of a constant named HOURS which actually causes a delay of one
second per hour to speed up program execution to a reasonable
level.

Eating a meal at the restaurant requires half an hour to be served
and another half hour to consume the meal, whereas the Burger Boy
requires only one tenth of an hour to be served and another tenth
to consume the meal.  The task named Bills_Day has him eating three
meals only one hour apart, and the task named Johns_Day has him
eating two meals in rapid succession then waiting four hours until
he eats supper.  Another interesting point is the fact that both
eat every meal at the restaurant with no concern for how long they
have to wait to be seated and eat.  It is of no concern either to
the Ada program at hand or the analysis of the problem, that one
of the tasks is never called, because this is perfectly legal.
Finally, both the restaurant and the Burger Boy can only serve one
customer at a time, since this is the way the tasks were
programmed.  They can however, each serve a different customer at
the same time.


EATING MEALS IS VERY SLOW
_________________________________________________________________

You will notice, by inspecting the delays, that John waits 0.4
hours and gets to the restaurant first, then takes a total of one

                                                        Page 26-1

                          Chapter 26 - The Conditional Rendezvous

hour to eat.  Bill waits one hour, and goes to the restaurant, but
must wait on the entry queue for 0.4 hours for John to finish
eating, then takes another hour to eat.  During this hour, John has
returned and is waiting to be served again.  They continue getting
in each others way and finally each consumes three meals.


DEADLOCK OCCURS
_________________________________________________________________

The observant student will notice that the tasks named Bills_Day
and Johns_Day each run through sequentially to completion and make
no additional calls.  The two named Restaurant and Burger_Boy
however, each consist of an infinite loop and never actually
complete.  When the first two tasks execute to completion, the
system will recognize that there are no tasks running that are
capable of making calls to the waiting accept statements.  The
system will recognize this condition, and it will terminate the
program due to deadlock after displaying a message that deadlock
has occurred.

We still have not given an acceptable method of terminating our
program gracefully, but we will later in this chapter.  You should
spend the time necessary to thoroughly understand this program
since it will be the basis for the remaining example programs in
this chapter.  When you do understand it, compile and execute it
to see if your compiler will recognize the deadlock condition.



THE CONDITIONAL RENDEZVOUS
_________________________________________________________________

Examine the program named MEALS2.ADA for our     ================
first example of a conditional rendezvous.  This    MEALS2.ADA
program is identical to the last one named       ================
MEALS1.ADA except for the addition of a few
statements in the task named Bills_Day.  In this
program Bill is in a bit of a hurry to eat his first two meals and
puts in a few conditions to indicate this.


THE SELECTED RENDEZVOUS
_________________________________________________________________

When Bill starts his day, he is very impatient and will not wait
at all for his first meal.  If the restaurant is not ready to serve
a meal immediately, he will go to the Burger Boy and have his
breakfast.  The statements in lines 29 through 33 replace the
single statement in line 29 of the last program to indicate this
impatience.  In Ada terms, if the task named Restaurant is not
waiting at the Eat_A_Meal entry point, the call will not be made
there, but a call will be made to the entry point named Eat_A_Meal
in the Burger_Boy task.  If the Burger_Boy task is not waiting at

                                                        Page 26-2

                          Chapter 26 - The Conditional Rendezvous

the entry point, then Bill will be required to wait until it is
ready, when he will be served.

The reserved word else is used to indicate the selected rendezvous
and it can follow as many or clauses as desired.  The general form
is;

     select
        <entry call>;
     or
        <entry call>;
     else
        <entry call>;
     end select;

The else clause will be taken if none of the other entry points are
waiting at their respective rendezvous points.


THE DELAYED RENDEZVOUS
_________________________________________________________________

Bill is not quite as hungry for his second meal so he is willing
to wait for a short period at the restaurant, but if he is not
served within one tenth of an hour, he will go to the Burger Boy
for lunch.  The single statement in lines 35 through 40 replaces
the statement in line 31 of the previous program.  In Ada terms,
the task named Bills_Day will wait .1 hour for the Restaurant task
to reach its entry point, after which it will call the entry point
of Burger_Boy and wait no matter how long it takes to be served
there.

As many selections as desired can be used, with delay statements
in as many of the selections as needed.  The general form is given
by;

     select
        delay <time>;
        <entry call>;
     or
        delay <time>;
        <entry call>;
     or
        delay <time>;
        <entry call>;
     end select;

An else clause cannot be used if any delay statements are used
because the else clause will be executed immediately and any
statement with a delay would never have a chance to time out.  It
would therefore never be executed and must be regarded as
unexecutable code.



                                                        Page 26-3

                          Chapter 26 - The Conditional Rendezvous

BILL'S STUBBORN RESOLUTION FOR SUPPER
_________________________________________________________________

Bill has decided that under no conditions will he eat supper at the
Burger Boy.  He will wait for as long as he has to in order to be
served at the restaurant, and this is reflected in the single call
in line 42 in exactly the same manner that was indicated in the
last program.

Take careful notice that both of these select statements are in the
calling task, not the called task, but we will see shortly that the
same sort of things are available in the called task.

Examination of the result of execution will reveal that Bill did
eat both of his early meals at the Burger Boy.  In addition, you
will see that his second meal was ordered and eaten at the Burger
Boy during the time that John was eating his meal at the
Restaurant.  This indicates that resources are being well used.

Be sure to compile and execute this program.  Observe the result
of execution to see that it does send Bill to the Burger Boy on
occasion.  Because we still have no graceful termination, deadlock
occurs once again.


THE DELAYED ENTRY POINT
_________________________________________________________________

Examine the program named MEALS3.ADA for yet     ================
another addition to our example of Bill and John    MEALS3.ADA
satisfying their desire for nourishment.  In     ================
this case, the restaurant will not remain open
forever, nor will the Burger Boy, both choosing
to close for the day if there are no customers for a period of
time.

The select statement in lines 59 through 72 contains two
alternatives, one to handle a customer as usual, and another with
a delay of 1.5 hours followed by a restaurant closing statement.
If there are no entry calls to the entry named Eat_A_Meal for 1.5
seconds (since HOURS is actually one second), then the other branch
of the select statement will be executed, resulting in the display
of a message and execution of an exit statement.  You will recall
that an exit will take you out of the most immediate loop and
continue execution of statements from that point.  In the case of
the Restaurant task, the task is therefore completed and waits for
the other tasks to complete.

The task named Burger_Boy has the same alternative entry point,
except for a delay of 2.1 seconds.  It also reaches its end
statement and waits for the others to finish.  Examination of the
result of execution will reveal that both eating establishments
actually did reach timeout and closed for the day leaving John to
go hungry since he never ate his third meal.  Since John did not

                                                        Page 26-4

                          Chapter 26 - The Conditional Rendezvous

eat his third meal of the day, some code was not executed and it
was not reported as such.  This seems to be an error, but it is
actually not, because it is a tasking error that is not propagated
to the main program.  This is according to the definition of Ada
and is explained more fully in the last paragraph of this chapter.

Be sure to compile and run this program and observe the early
closing of the eating establishments.


ORDERLY TERMINATION OF TASKS
_________________________________________________________________

Examine the program named TERMINAT.ADA for an    ================
example of orderly termination of tasks.  This     TERMINAT.ADA
program is identical to the first program in     ================
this chapter named MEALS1.ADA except for two
minor changes.  The entry point for the task
named Restaurant has been put inside of a select statement in a
manner similar to that done in MEALS2.ADA or MEALS3.ADA but a
different "or" clause is used, one that contains the reserved word
terminate.  Each time through the loop, the entry point named
Eat_A_Meal can be selected for execution and the task execution
will wait until this entry point is called.  While the program is
waiting for the entry call, the branch of the select with the
terminate allows the possibility of a termination to occur.
However, the termination can only occur under the right conditions.
The right conditions require that all other concurrent tasks,
including the parent task, are either at their final end waiting
to terminate, or have a similar terminate alternative to select.

The task named Burger_Boy has a similar terminate alternative.
When the two calling tasks reach their final end, the two serving
tasks have terminate alternatives available, so there is an orderly
termination and the program returns to the operating system.  Be
sure to compile and execute this program, then study the result for
conformance to this definition.



THE abort STATEMENT
_________________________________________________________________

The abort statement will unconditionally abort any tasks with no
regard to their present operating condition.  It is extremely
abrupt and does not provide for an orderly termination.  It should
therefore be used only in conditions of an emergency nature.
Possibly the detection of loss of power would be such a
circumstance.  The tasks to be aborted are listed following the
reserved word abort in an executable statement anywhere that it is
legal to use an executable statement.




                                                        Page 26-5

                          Chapter 26 - The Conditional Rendezvous

TWO TASK ATTRIBUTES
_________________________________________________________________

There are two useful task attributes that can be used to find the
condition of any given task.  They are CALLABLE, and TERMINATED,
and each returns a BOOLEAN type indication of the current status
of the task to which the attribute is appended.  See the LRM for
details on the use of these two attributes.


TASK EXCEPTIONS
_________________________________________________________________

The tasking exception named Tasking_Error is raised during
essentially any communication error.  Any error during task
elaboration will raise this exception (this will be illustrated in
a later example program).  This exception is raised in the caller
if the called task is aborted, and is raised in the originators of
all calls on an entry queue of an aborted task.

If an exception is raised during a rendezvous, it is propagated
into both tasks since each may need some form of recovery.  If the
exception is not handled internally by the task, it is not
propagated to the main program because to do so would be very
disruptive.  This means that a program that appears to be working
correctly could actually have a very disruptive tasking error, much
like the example program named MEALS3.ADA in this chapter.  Each
significant task should therefore have an exception handler to
guard against the occurrence of an unknown exception.


PROGRAMMING EXERCISE
_________________________________________________________________

1.   Modify the program named MEALS2.ADA such that it has an
     orderly termination upon completion.

2.   Modify MEALS2.ADA even further such that John eats every meal
     at the Burger Boy unless he has to wait there, in which case
     he eats at the restaurant.












                                                        Page 26-6