Re: Problem with access parameter
From: Jim Rogers (jimmaureenrogers_at_worldnet.att.net)
Date: 05/25/04
- Next message: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Previous message: Dmitry A. Kazakov: "Re: "Must instantiate controlled types at library level." Why?"
- Next in thread: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Reply: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Maybe reply: Martin Krischik: "Re: Problem with access parameter"
- Maybe reply: Martin Krischik: "Re: Problem with access parameter"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: 25 May 2004 07:00:48 -0700
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
- Next message: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Previous message: Dmitry A. Kazakov: "Re: "Must instantiate controlled types at library level." Why?"
- Next in thread: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Reply: Dmitry A. Kazakov: "Re: Problem with access parameter"
- Maybe reply: Martin Krischik: "Re: Problem with access parameter"
- Maybe reply: Martin Krischik: "Re: Problem with access parameter"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]