From mboxrd@z Thu Jan 1 00:00:00 1970 X-Spam-Checker-Version: SpamAssassin 3.4.4 (2020-01-24) on polar.synack.me X-Spam-Level: X-Spam-Status: No, score=-1.9 required=5.0 tests=BAYES_00 autolearn=ham autolearn_force=no version=3.4.4 X-Google-Thread: 103376,ebfd1d7c60facfc5 X-Google-Attributes: gid103376,public X-Google-Language: ENGLISH,ASCII-7-bit From: "Scott Travak" Newsgroups: comp.lang.ada References: <414eee7d@dnews.tpgi.com.au> <7e7vk0dv2qhpqbdd58c0bvpesitapijr8v@4ax.com> <414fcddf@dnews.tpgi.com.au> <87y8j3foto.fsf@insalien.org> Subject: Re: elaboration circularity detected problem, How to fix? Date: Wed, 22 Sep 2004 06:15:58 +1000 Organization: - X-Priority: 3 X-MSMail-Priority: Normal X-Newsreader: Microsoft Outlook Express 6.00.2900.2180 X-MimeOLE: Produced By Microsoft MimeOLE V6.00.2900.2180 X-RFC2646: Format=Flowed; Original NNTP-Posting-Host: 220.244.246.157 X-Original-NNTP-Posting-Host: 220.244.246.157 Message-ID: <41508c02@dnews.tpgi.com.au> X-Trace: dnews.tpgi.com.au!tpg.com.au 1095797762 220.244.246.157 (22 Sep 2004 06:16:02 +1000) Path: g2news1.google.com!news2.google.com!proxad.net!newsfeed.stueberl.de!newsfeed.freenet.de!nntp.gblx.net!nntp3.phx1!dnews.tpgi.com.au!tpg.com.au!not-for-mail Xref: g2news1.google.com comp.lang.ada:3905 Date: 2004-09-22T06:15:58+10:00 List-Id: 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" 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.