{ PURPOSE
{
{   Defines a condition handler procedure and the conditions for which it
{   should be invoked.  Since a procedure may have multiple handlers, each for
{   multiple conditions, these records are linked together in a stack.  The on
{   condition flag in the stack frame is used to show the presence of one or
{   more established handlers.  If block exit processing is selected then the
{   critical frame flag is also set in the stack frame.
{
{ DESIGN
{   ESTABLISHED: Signifies that the condition has not been disestablished.
{
{   EST_HANDLER_STACK:  Link to the next handler in the condition stack.
{
{   HANDLER:  Pointer to the condition handler routine to be invoked when
{     the condition or conditions defined in ESTABLISHED_CONDITIONS occur.
{
{   ESTABLISHED_CONDITIONS:  What conditions the handler has been established
{     for.
{
{   HANDLER_ACTIVE:  Defines which system or segment access conditions the
{     handler is currently processing.  If an attempt is made to call the
{     handler with a condition already being processed by the handler then
{     the task is aborted by calling PMP$EXIT.

{ NOTE:
{   If this type changes, the procedure pmp$intercept_call_procedure in
{   pmm$intercept_procedures which establishes its own block exit condition
{   handler must also be changed.

  TYPE
    pmt$established_handler = record
      established: boolean,
      est_handler_stack: ^pmt$established_handler,
      handler: pmt$condition_handler,
      established_conditions: pmt$condition,
      handler_active: pmt$condition_handler_active,
    recend,

    pmt$condition_handler_active = record
      system: pmt$system_conditions,
      segment_access: mmt$segment_access_condition,
    recend;

*copyc pmt$condition
*copyc pmt$condition_handler
