comp.lang.ada
 help / color / mirror / Atom feed
From: "Scott Travak" <s.travak@j-inet.com>
Subject: Re: elaboration circularity detected problem, How to fix?
Date: Wed, 22 Sep 2004 06:15:58 +1000
Date: 2004-09-22T06:15:58+10:00	[thread overview]
Message-ID: <41508c02@dnews.tpgi.com.au> (raw)
In-Reply-To: 87y8j3foto.fsf@insalien.org

Thanks for that Dennis and Ludovic! The both of you helped me out a lot on 
this. From Dennis I realised that I could be splitting the 'Location' 
package into two seperate packages "Location_Send' and 'Location_Receive'. 
In that case circularity is removed. Ludovic pointed me towards a problem 
being in Station.Chicago_Ptr not being initialised. The program works great 
now.

Yep the tasks CHICAGO_RECEIVE and DESTINATION are still waiting for input. I 
removed some code to make my posted code smaller. My original code controls 
all shutdowns to all tasks.

Thanks so much again!

Cheers, Scott



"Ludovic Brenta" <ludovic.brenta@insalien.org> wrote in message 
news:87y8j3foto.fsf@insalien.org...
>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 20:15 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
2004-09-21 20:15       ` Scott Travak [this message]
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