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-Language: ENGLISH,ASCII-7-bit X-Google-Thread: 103376,b031c56dc601135 X-Google-Attributes: gid103376,public Path: controlnews3.google.com!postnews1.google.com!not-for-mail From: jimmaureenrogers@worldnet.att.net (Jim Rogers) Newsgroups: comp.lang.ada Subject: Re: Problem with access parameter Date: 25 May 2004 07:00:48 -0700 Organization: http://groups.google.com Message-ID: <82347202.0405250600.2a911b52@posting.google.com> References: <5d6fdb61.0405250252.3a1f1f68@posting.google.com> NNTP-Posting-Host: 209.194.156.4 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 8bit X-Trace: posting.google.com 1085493648 11986 127.0.0.1 (25 May 2004 14:00:48 GMT) X-Complaints-To: groups-abuse@google.com NNTP-Posting-Date: Tue, 25 May 2004 14:00:48 +0000 (UTC) Xref: controlnews3.google.com comp.lang.ada:816 Date: 2004-05-25T07:00:48-07:00 List-Id: 402450@cepsz.unizar.es (Jano) wrote in message news:<5d6fdb61.0405250252.3a1f1f68@posting.google.com>... > Hi, > > I'm trying to finalize data inside a protected type, using the > approach pasted at the end. I'm not sure if I get this bizarre error > because of a Gnat 3.15p bug or because what I'm trying is illegal: > > agpl-counter-multi.ads:59:04: expected an access type with designated > type "Object" defined at line 59 > agpl-counter-multi.ads:59:04: found an access type with designated > type derived from "Object" defined at line 59 > agpl-counter-multi.ads:59:04: ==> in call to "_Init_Proc" at line 73 > > The package code is: (trimmed) > > package Agpl.Counter.Multi is > > type Object; > type Object_Access is access all Object; > > type Destructor_Type (Parent : access Object) is limited private; The discriminant type is not the same as Object_Access. It is an anonymous type. If you want to use Object_Access as the discriminant type then specify this clearly. > > ---------------------------------------------------------------- > -- Object -- > ---------------------------------------------------------------- > protected type Object is > -- Things > private > procedure Destroy; > Destructor : Destructor_Type (Object'Access); Object is the name of a type. You cannot take the access value of a type, only of an instance. It looks like you are trying to create something equivalent to a C++ or Java "this" reference. What are you trying to achieve? > Values : Counter_Map.Container_Type; > end Object; > > private > > type Destructor_Type (Parent : access Object) is new > Finalization.Limited_Controlled with null record; > > procedure Finalize (This : in out Destructor_Type); > -- Here call to This.Parent.Destroy; You are trying to destroy a protected object from within itself. Such an operation can cause a large number of problems. What happens to tasks waiting in an entry queue for the protected object? Are they released from the queue? I do not believe the Ada Reference Manual specifies the results of such an operation. > > end Agpl.Counter.Multi; Remember that Ada protected objects are used as communication buffers between two or more tasks. Destroying a protected object because of a finalization call on one of its members appears to be a very wobbly design. Jim Rogers