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 Path: g2news1.google.com!news1.google.com!news.glorb.com!border1.nntp.dca.giganews.com!nntp.giganews.com!newshosting.com!nx02.iad01.newshosting.com!newsfeed2.ip.tiscali.net!transit0.news.tiscali.nl!tiscali!transit1.news.tiscali.nl!dreader2.news.tiscali.nl!not-for-mail Newsgroups: comp.lang.ada Subject: Re: elaboration circularity detected problem, How to fix? References: <414eee7d@dnews.tpgi.com.au> <7e7vk0dv2qhpqbdd58c0bvpesitapijr8v@4ax.com> <414fcddf@dnews.tpgi.com.au> From: Ludovic Brenta Date: Tue, 21 Sep 2004 20:40:19 +0200 Message-ID: <87y8j3foto.fsf@insalien.org> User-Agent: Gnus/5.1006 (Gnus v5.10.6) Emacs/21.3 (gnu/linux) Cancel-Lock: sha1:bAOiITome5Q7q5H0m7Fe1IfbzXE= MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii Organization: Tiscali bv NNTP-Posting-Date: 21 Sep 2004 20:43:00 CEST NNTP-Posting-Host: 83.134.238.231 X-Trace: 1095792180 dreader2.news.tiscali.nl 62393 83.134.238.231:35302 X-Complaints-To: abuse@tiscali.nl Xref: g2news1.google.com comp.lang.ada:3902 Date: 2004-09-21T20:43:00+02:00 List-Id: 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.