comp.lang.ada
 help / color / mirror / Atom feed
From: Ludovic Brenta <ludovic.brenta@insalien.org>
Subject: Re: elaboration circularity detected problem, How to fix?
Date: Tue, 21 Sep 2004 20:40:19 +0200
Date: 2004-09-21T20:43:00+02:00	[thread overview]
Message-ID: <87y8j3foto.fsf@insalien.org> (raw)
In-Reply-To: 414fcddf@dnews.tpgi.com.au

I had to modify Scott's code just a wee bit and I tried it on two
compilers, one being GNAT 3.15p on Debian.  None of the compilers gave
any error message, and the program runs as expected.  Here is my
slightly amended version.  The changes are:

- place everything into one procedure, with nested packages

- remove Station.Chicago_Ptr, which hides the top-level Chicago_Ptr
  but is different, since its pointers are left uninitialised.  In
  fact, this may well be the source of the problem.

Enjoy:

with Ada.Text_Io;
use Ada.Text_Io;

procedure Circularity is

    type Location_Type is (Chicago, Paris, London);

    generic
        Centre : Location_Type;
    package Location is
        task type Send_Type is
        end Send_Type;

        task type Receive_Type is
            entry Ack_Channel;
        end Receive_Type;

        type Send_Ptr_Type is access Send_Type;
        type Receive_Ptr_Type is access Receive_Type;

        Send_Ptr : Send_Ptr_Type;
        Receive_Ptr : Receive_Ptr_Type;
    end Location;


    package Station is
        task Destination is
            entry Signal;
        end Destination;
    end Station;


    package body Location is
        task body Send_Type is
            Calls : Integer := 2;
            Done : Boolean := False;
        begin
            Put_Line (Location_Type'Image (Centre) & "_SEND alive");
            while Calls > 0 loop
                delay 0.1;
                Put_Line (Location_Type'Image (Centre) &
                          " pings the Destination");
                Station.Destination.Signal;
                Calls := Calls - 1;
            end loop;
            Put_Line (Location_Type'Image (Centre) & "_SEND dead");
        end Send_Type;


        task body Receive_Type is
            Done : Boolean := False;
        begin
            Put_Line (Location_Type'Image (Centre) & "_RECEIVE alive");
            while not Done loop
                select
                    accept Ack_Channel do
                        Put_Line (Location_Type'Image (Centre) &
                                  " received an acknowledgement");
                    end Ack_Channel;
                else
                    delay 0.1;
                end select;
            end loop;
            Put_Line (Location_Type'Image (Centre) & "_RECEIVE dead");
        end Receive_Type;
    end Location;


    package Chicago_Ptr is new Location (Chicago);


    package body Station is
        task body Destination is
            Done : Boolean := False;
        begin
            Put_Line ("DESTINATION alive");
            while not Done loop
                select
                    accept Signal do
                        Put_Line ("DESTINATION: Received signal");
                        Chicago_Ptr.Receive_Ptr.Ack_Channel;
                    end Signal;
                else
                    delay 0.1;
                end select;
            end loop;
            Put_Line ("DESTINATION dead");
        end Destination;
    end Station;

begin
    Chicago_Ptr.Send_Ptr := new Chicago_Ptr.Send_Type;
    Chicago_Ptr.Receive_Ptr := new Chicago_Ptr.Receive_Type;
end Circularity;


The output is:
./circularity
DESTINATION alive
CHICAGO_SEND alive
CHICAGO_RECEIVE alive
CHICAGO pings the Destination
DESTINATION: Received signal
CHICAGO received an acknowledgement
CHICAGO pings the Destination
DESTINATION: Received signal
CHICAGO received an acknowledgement
CHICAGO_SEND dead

The program does not exit; of course, the tasks CHICAGO_RECEIVE and
DESTINATION are still waiting for input.  Hence the program behaves as
expected, at least for me.

-- 
Ludovic Brenta.



  reply	other threads:[~2004-09-21 18:40 UTC|newest]

Thread overview: 14+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2004-09-20 14:51 elaboration circularity detected problem, How to fix? Scott Travak
2004-09-20 15:52 ` Martin Dowie
2004-09-20 17:11   ` Florian Weimer
2004-09-20 21:19     ` Randy Brukardt
2004-09-21 10:09       ` Martin Dowie
2004-09-21 17:53         ` Randy Brukardt
2004-09-21  6:32   ` Scott Travak
2004-09-21  7:30     ` gnat options (Re: " Peter Hermann
2004-09-21  8:00       ` Scott Travak
2004-09-21  8:09       ` Alex R. Mosteo
     [not found] ` <7e7vk0dv2qhpqbdd58c0bvpesitapijr8v@4ax.com>
2004-09-21  6:44   ` Scott Travak
2004-09-21 18:40     ` Ludovic Brenta [this message]
2004-09-21 20:15       ` Scott Travak
2004-09-22 21:08 ` Simon Wright
replies disabled

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