From: "Dmitry A. Kazakov" <mailbox@dmitry-kazakov.de>
Subject: Re: Controlled types and exception safety
Date: Wed, 30 Nov 2005 16:06:52 +0100
Date: 2005-11-30T16:06:52+01:00 [thread overview]
Message-ID: <he6790lx2j0a$.1xbozsrrw49xj$.dlg@40tude.net> (raw)
In-Reply-To: dmkb3j$h4q$1@sunnews.cern.ch
On Wed, 30 Nov 2005 14:57:07 +0100, Maciej Sobczak wrote:
> Let's say that I want to write a stack in Ada. Making it a Controlled
> type seems to be a good idea, so that we have hooks for initialization,
> adjusting and finalization. Let's say that I have two stack objects, X
> and Y:
>
> X, Y : Stack;
>
> These objects were populated with some data, so that each of them
> manages its own internal dynamic data structure.
> Now, I do this:
>
> X := Y;
>
> and the following happens (this is what I understand, please correct me
> if I'm wrong):
>
> 1. X is finalized. This allows me to clean up (free) its internal data.
> 2. Y is *shallow-copied* to X, so that in effect X and Y share their state.
> 3. X is adjusted. This allows me to duplicate its internal structure so
> that it becomes independent from Y.
>
> later:
> 4. Both X and Y are finalized. This allows me to clean up (free) their
> resources.
>
> For everything to work correctly it's important that two separate stack
> objects *never* share their internal dynamic data structure, otherwise
> bad things can happen. It would be also fine not to leak memory.
>
> Now, the interesting part: let's say that during adjustment (3.) some
> error happened (like low memory condition or whatever) that resulted in
> raising an exception
ARM 7.6.1 reads: "It is a bounded error for a call on Finalize or Adjust to
propagate an exception.
[...]
For an Adjust invoked as part of an assignment operation, any other
adjustments due to be performed are performed, and then Program_Error is
raised."
> I think that the inherent problem comes from the fact that the
> finalization of X was forced *before* its adjustment.
> The canonical C++ way is to *first* make a copy of new value (because
> this is when errors might occur, so that even if they occur, there was
> no change in the destination object) and *then* inject the duplicate
> into the destination object, getting rid of its old state (and this is
> assumed to be nothrow).
Here the semantics of "copy", "inject", "duplicate" is ill-defined. In
general, you can copy a set of bits, but you cannot an object without
defining it in the terms copy-constructor. In Ada's case copy-constructor
is defined as Bitwise copy + Adjust. It is an atomic operation. Which is
equivalently means that in general case you cannot define any reasonable
semantics for its partial completion.
> The "Ada way" looks like selling the house *before* looking for the new one.
>
> What do you do to avoid surprises?
Don't let exceptions propagate.
--
Regards,
Dmitry A. Kazakov
http://www.dmitry-kazakov.de
next prev parent reply other threads:[~2005-11-30 15:06 UTC|newest]
Thread overview: 37+ messages / expand[flat|nested] mbox.gz Atom feed top
2005-11-30 13:57 Controlled types and exception safety Maciej Sobczak
2005-11-30 15:06 ` Dmitry A. Kazakov [this message]
2005-11-30 16:19 ` Maciej Sobczak
2005-12-01 0:05 ` Stephen Leake
2005-12-01 9:21 ` Dmitry A. Kazakov
2005-12-01 10:46 ` Maciej Sobczak
2005-12-01 15:08 ` Dmitry A. Kazakov
2005-12-02 4:17 ` Randy Brukardt
2005-12-02 9:29 ` Maciej Sobczak
2005-12-02 18:12 ` tmoran
2005-12-02 19:15 ` Robert A Duff
2005-12-02 21:42 ` tmoran
2005-12-06 9:00 ` Maciej Sobczak
2005-12-06 9:50 ` Dmitry A. Kazakov
2005-12-06 18:34 ` Jeffrey R. Carter
2005-12-06 19:34 ` Randy Brukardt
2005-12-06 21:20 ` Dmitry A. Kazakov
2005-12-07 1:57 ` Jeffrey R. Carter
2005-12-08 0:50 ` Randy Brukardt
2005-12-08 19:37 ` Jeffrey R. Carter
2005-12-09 2:36 ` Randy Brukardt
2005-12-09 6:33 ` Jeffrey R. Carter
2005-12-09 20:35 ` Randy Brukardt
2005-12-10 7:53 ` Jeffrey R. Carter
2005-12-06 20:43 ` Dmitry A. Kazakov
2005-12-07 2:00 ` Jeffrey R. Carter
2005-12-07 10:01 ` Dmitry A. Kazakov
2005-12-02 23:21 ` Robert A Duff
2005-11-30 17:46 ` Jean-Pierre Rosen
2005-11-30 21:02 ` Jeffrey R. Carter
2005-11-30 22:06 ` Björn Persson
2005-11-30 23:52 ` Randy Brukardt
2005-12-01 5:26 ` Jeffrey R. Carter
2005-12-02 23:51 ` Robert A Duff
2005-12-06 11:41 ` Peter C. Chapin
2005-12-06 12:50 ` Jean-Pierre Rosen
2005-12-06 13:06 ` Dmitry A. Kazakov
replies disabled
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox