comp.lang.ada
 help / color / mirror / Atom feed
From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Ada OS based on Minix3
Date: Wed, 12 Nov 2008 10:47:37 +0100
Date: 2008-11-12T10:47:37+01:00	[thread overview]
Message-ID: <14ay3vz2ngj9s.1bmilwgckl3lc$.dlg@40tude.net> (raw)
In-Reply-To: wcc3ahxncct.fsf@shell01.TheWorld.com

On Tue, 11 Nov 2008 17:09:54 -0500, Robert A Duff wrote:

> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
> 
>> On Mon, 10 Nov 2008 10:31:27 -0500, Robert A Duff wrote:
>>
>>> "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de> writes:
>>> 
>>>> 6. Proper construction/destruction
>>> 
>>> What do you see as the limitations/problems with Ada in this area?
>>
>> 1. User-defined initialization/finalization shall be definable for any
>> type. I do mean any.
> 
> Finalization: Agreed, but the compiler really needs to take care to
> avoid distributed overhead.

I don't see why it should be a distributed overhead. For example, access
types are already initialized by null. The overhead, if any, is here, but
it does not hurt.

> Initialization: Use function calls.  They work for all types.
> I think we've discussed this idea before, but I don't remember
> any fundamental problems.

The fundamental problem is that a constructor cannot be decomposed into
functions. In the function body you have to construct the object before you
return it. Who does it and what?

Under initialization I do not mean replacing a "default" value with
something else. I mean creation a new object (at some memory location)
initialized by a value. It had no other value before.

Doing this by a function is semantically wrong.

> The Initialize procedure of controlled
> types seems unnecessary to me (although something needs to be done
> regarding abort deferral).

Right, because Initialize receives an already constructed object. It is too
late to do many type-specific initializations, but too early to make the
class-wide ones.

>> 2. Composition rules of initialization/finalization for derived types must
>> ensure execution of the user-defined initialization/finalization code for
>> the base type.
> 
> Agreed (except I think you mean "parent type", not "base type").

Well, I am unsure if there must be such distinction in the first place.
But, OK, to begin with, let it be parent type.

> This is a more general issue -- it would be useful to say
> "must call parent op" for various things, including Finalize.

Yes, it would be great to have "extensible" primitive operations.

>> 3. User-defined initialization/finalization shall be definable for
>> class-wide types. AKA dispatch from constructor/destructor. Actually, a
>> part of the pos. 1.
> 
> OK.  There are some interesting issues here -- the constructor (a
> function, in my mind) might want to plug a pointer-to-classwide into
> some global data structure, but I want to make sure the specific-typed
> thing is fully initialized and ready to be dispatched to, before that
> happens.

Right.

>> 4. Task-as-a-component problem to be solved.
> 
> Which problem is that?

I mean the pattern:

   type Active is new Ada.Finalization.Limited_Controlled ...;
private
   task Agent (Object : not null access Active'Class) ...
   type Active is new Ada.Finalization.Limited_Controlled with record
      Agent : Task (Active'Access);
   end record;

It is broken, not even worth to try.

Even in rare cases when the component task does not refer to its container
type, the only way to make it working is to have a pointer to the task
instead.

In fact, any mix-in with an access to class-wide is extremely dangerous and
error prone, *because* it is very difficult to initialize and finalize such
things properly. But this is another story (about why we should have MI).

>> 5. Getting a pool-specific pointer to the object upon
>> initialization/finalization, when the object is allocated in such a pool.
>> (Unchecked_Conversion is really nasty there)
> 
> I think you mean Unchecked_Access -- Unchecked_Conversion is not
> necessary.
> 
> I don't see how this can make sense.  In Initialize or Finalize, you
> don't know whether the object is in a pool, nor which pool.  So how can
> you get a pool-specific pointer?

That is exactly the problem. Consider objects allocated on a user-defined
pool. The object are linked into some list. When a new object is created
the "constructor" places it into the list. When the object is destroyed,
the "destructor" removes it. For both, you need a self-pointer, but you
cannot get it from an "in out" parameter. If access types had
constructors/destructors, the programmer could place that stuff there,
rather that trying to do it in the object. It does not belong there.

> Also, given point 1 ("any type") the thing being init/finalized could be
> a bitfield component of a packed record.  Pointers to bitfields could
> cause distributed overhead, if you're not careful.

This is an issue how a constructor is chosen by the compiler. 

>> 6. LHS/RHS issue.
> 
> What issue is that?

I meant access to the left part of assignment. Provided that the assignment
is to be generated out of the constructor and destructor.

> How about:
> 
> 7. It would be nice if Finalize would be passed a parameter indicating
>    the reason for finalization (normal exit, some exception occurrence,
>    abort).  Perhaps also an ability to declare that finalization only
>    applies to certain "reasons".

Yes, I always wished to have this for DB transaction objects. When the
object is killed by an exception propagation it rolls the updates back.
Otherwise it commits.

> 8. Interactions with user-defined storage pools.
> 
> 9. Interactions with garbage collection.

I hope this can be solved on the basis of the constructor/destructor of the
corresponding access type.

Pool-specific named access types is one of the coolest things in Ada, IMO.

> 10. Reify the finalization operation (that is, the operation on some
>     type that calls Finalize on all the parts of it, including the
>     whole).

I.e. a destructor. But it is semantically broken to have such. It would
destroy an object leaving a dangling typed name of.

I think that the trick can be achieved with an access type to some fake
storage pool. The Unchecked_Deallocation is called on the pointer. That
does the finalization. Then the pool's Deallocate is called, which does
nothing.

-- 
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de



  reply	other threads:[~2008-11-12  9:47 UTC|newest]

Thread overview: 40+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2008-11-07 14:10 Ada OS based on Minix3 Cedric.Lannock
2008-11-07 16:20 ` xavier grave
2008-11-08  3:46 ` anon
2008-11-10  8:12 ` Ivan Levashew
2008-11-10  8:58   ` Dmitry A. Kazakov
2008-11-10  9:26     ` Ivan Levashew
2008-11-10 10:11     ` Georg Bauhaus
2008-11-10 10:24     ` Jacob Sparre Andersen
2008-11-10 10:51       ` Dmitry A. Kazakov
2008-11-10 11:07         ` Ludovic Brenta
2008-11-10 11:42           ` Ivan Levashew
2008-11-10 12:04             ` Ludovic Brenta
2008-11-11 22:16           ` Robert A Duff
2008-11-12  6:28             ` Ivan Levashew
2008-11-10 10:50     ` Ivan Levashew
2008-11-10 11:01       ` Dmitry A. Kazakov
2008-11-10 15:31         ` Robert A Duff
2008-11-10 15:56           ` Dmitry A. Kazakov
2008-11-11 22:09             ` Robert A Duff
2008-11-12  9:47               ` Dmitry A. Kazakov [this message]
2008-11-13  0:58                 ` Randy Brukardt
2008-11-13 17:28                   ` Dmitry A. Kazakov
2008-11-13 23:25                     ` Randy Brukardt
2008-11-14  9:30                       ` Dmitry A. Kazakov
2008-11-14 23:11                 ` Robert A Duff
2008-11-15 10:04                   ` Dmitry A. Kazakov
2008-11-15 11:57                     ` Programmer controlled object creation (was: Re: Ada OS based on Minix3) Georg Bauhaus
2008-11-15 12:44                       ` Programmer controlled object creation Dmitry A. Kazakov
2008-11-10 10:18   ` Ada OS based on Minix3 Georg Bauhaus
2008-11-11  1:00 ` Freejack
2008-11-11  8:32 ` Martin Krischik
2008-11-11 11:09   ` Peter C. Chapin
2008-11-11 11:59     ` Georg Bauhaus
2008-11-11 14:35       ` Ludovic Brenta
2008-11-11 16:49         ` Georg Bauhaus
2008-11-13  7:10         ` Martin Krischik
2008-11-13  7:01       ` Martin Krischik
2008-11-13  6:48     ` Martin Krischik
2008-11-13  8:09       ` Thomas Locke
2008-11-13 10:16         ` Alex R. Mosteo
replies disabled

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox