Commit 3a859cff by Ed Schonberg Committed by Arnaud Charlet

a-coinho-shared.adb, [...]: Proper structures for tampering checks.

2014-07-16  Ed Schonberg  <schonberg@adacore.com>

	* a-coinho-shared.adb, a-coinho-shared.ads: Proper structures for
	tampering checks.

From-SVN: r212642
parent 88c90b68
2014-07-16 Ed Schonberg <schonberg@adacore.com>
* a-coinho-shared.adb, a-coinho-shared.ads: Proper structures for
tampering checks.
2014-07-16 Ed Schonberg <schonberg@adacore.com>
* a-coinho-shared.adb: Fix spurious accessibility check.
2014-06-15 Jan Hubicka <hubicka@ucw.cz>
......
......@@ -65,7 +65,12 @@ package body Ada.Containers.Indefinite_Holders is
overriding procedure Adjust (Control : in out Reference_Control_Type) is
begin
if Control.Container /= null then
Reference (Control.Container);
Reference (Control.Container.Reference);
declare
B : Natural renames Control.Container.Busy;
begin
B := B + 1;
end;
end if;
end Adjust;
......@@ -115,9 +120,12 @@ package body Ada.Containers.Indefinite_Holders is
is
Ref : constant Constant_Reference_Type :=
(Element => Container.Reference.Element.all'Access,
Control => (Controlled with Container.Reference));
Control => (Controlled with Container'Unrestricted_Access));
B : Natural renames Ref.Control.Container.Busy;
begin
Reference (Ref.Control.Container);
Reference (Ref.Control.Container.Reference);
B := B + 1;
return Ref;
end Constant_Reference;
......@@ -168,7 +176,8 @@ package body Ada.Containers.Indefinite_Holders is
overriding procedure Finalize (Control : in out Reference_Control_Type) is
begin
if Control.Container /= null then
Unreference (Control.Container);
Unreference (Control.Container.Reference);
Control.Container.Busy := Control.Container.Busy - 1;
end if;
Control.Container := null;
......@@ -284,9 +293,10 @@ package body Ada.Containers.Indefinite_Holders is
is
Ref : constant Reference_Type :=
(Element => Container.Reference.Element.all'Access,
Control => (Controlled with Container.Reference));
Control => (Controlled with Container'Unrestricted_Access));
begin
Reference (Ref.Control.Container);
Reference (Ref.Control.Container.Reference);
Container.Busy := Container.Busy + 1;
return Ref;
end Reference;
......
......@@ -97,6 +97,7 @@ private
use Ada.Streams;
type Element_Access is access all Element_Type;
type Holder_Access is access all Holder;
type Shared_Holder is record
Counter : System.Atomic_Counters.Atomic_Counter;
......@@ -131,7 +132,7 @@ private
type Reference_Control_Type is new Controlled with
record
Container : Shared_Holder_Access;
Container : Holder_Access;
end record;
overriding procedure Adjust (Control : in out Reference_Control_Type);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment