stopped using System.Atomic_Counters.Atomic_Counter

This commit is contained in:
hyung-hwan 2021-08-24 16:07:29 +00:00
parent 757ef193ca
commit 081937df1b
5 changed files with 26 additions and 37 deletions

View File

@ -5,8 +5,8 @@ package body H3.MM is
begin begin
Finalize (R); Finalize (R);
R.Data := new Ref_Counted_Record; R.Data := new Ref_Counted_Record;
--R.Data.Ref_Count := 1; R.Data.Ref_Count := 1;
System.Atomic_Counters.Initialize (R.Data.Ref_Count); -- initialize to 1 --System.Atomic_Counters.Initialize (R.Data.Ref_Count); -- initialize to 1
end Create; end Create;
procedure Create (R: in out Ref_Counted; V: in Item_Type) is procedure Create (R: in out Ref_Counted; V: in Item_Type) is
@ -26,7 +26,8 @@ package body H3.MM is
function Is_Shared (R: in Ref_Counted) return Standard.Boolean is function Is_Shared (R: in Ref_Counted) return Standard.Boolean is
begin begin
return R.Data /= null and then not System.Atomic_Counters.Is_One(R.Data.Ref_Count); --return R.Data /= null and then not System.Atomic_Counters.Is_One(R.Data.Ref_Count);
return R.Data /= null and then R.Data.Ref_Count > 1;
end Is_Shared; end Is_Shared;
procedure Initialize (R: in out Ref_Counted) is procedure Initialize (R: in out Ref_Counted) is
@ -37,8 +38,8 @@ package body H3.MM is
procedure Adjust (R: in out Ref_Counted) is procedure Adjust (R: in out Ref_Counted) is
begin begin
if R.Data /= null then if R.Data /= null then
--R.Data.Ref_Count := R.Data.Ref_Count + 1; R.Data.Ref_Count := R.Data.Ref_Count + 1;
System.Atomic_Counters.Increment (R.Data.Ref_Count); --System.Atomic_Counters.Increment (R.Data.Ref_Count);
end if; end if;
end Adjust; end Adjust;
@ -46,10 +47,15 @@ package body H3.MM is
procedure Dealloc is new Ada.Unchecked_Deallocation(Ref_Counted_Record, Ref_Counted_Pointer); procedure Dealloc is new Ada.Unchecked_Deallocation(Ref_Counted_Record, Ref_Counted_Pointer);
begin begin
if R.Data /= null then if R.Data /= null then
if System.Atomic_Counters.Decrement(R.Data.Ref_Count) then --if System.Atomic_Counters.Decrement(R.Data.Ref_Count) then
-- The reference count reached 0 -- -- The reference count reached 0
-- Dealloc (R.Data);
-- -- R.DAta must be null here
--end if;
if R.Data.Ref_Count = 1 then
Dealloc (R.Data); Dealloc (R.Data);
-- R.DAta must be null here else
R.Data.Ref_Count := R.Data.Ref_Count - 1;
end if; end if;
end if; end if;
end Finalize; end Finalize;

View File

@ -7,7 +7,8 @@ package H3.MM is
type Item_Pointer is access all Item_Type; type Item_Pointer is access all Item_Type;
type Ref_Counted_Record is record type Ref_Counted_Record is record
Ref_Count: System.Atomic_Counters.Atomic_Counter; --Ref_Count: System.Atomic_Counters.Atomic_Counter;
Ref_Count: System_Size;
Item: aliased Item_Type; Item: aliased Item_Type;
end record; end record;

View File

@ -19,7 +19,7 @@ package body H3.Strings is
begin begin
return Str.Buffer.Slot'Length; return Str.Buffer.Slot'Length;
end Get_Hard_Capacity; end Get_Hard_Capacity;
pragma inline (Get_Hard_Capacity); pragma Inline (Get_Hard_Capacity);
function Get_Length (Str: in Elastic_String) return System_Size is function Get_Length (Str: in Elastic_String) return System_Size is
begin begin

View File

@ -16,28 +16,28 @@ package H3.Strings is
function To_Character_Array (Str: in Elastic_String) return Character_Array; function To_Character_Array (Str: in Elastic_String) return Character_Array;
function Get_Capacity (Str: in Elastic_String) return System_Size; function Get_Capacity (Str: in Elastic_String) return System_Size;
pragma inline (Get_Capacity); pragma Inline (Get_Capacity);
function Get_Length (Str: in Elastic_String) return System_Size; function Get_Length (Str: in Elastic_String) return System_Size;
pragma inline (Get_Length); pragma Inline (Get_Length);
-- the return type is System_Size for consistency with Get_FIrst_Index. -- the return type is System_Size for consistency with Get_FIrst_Index.
function Get_First_Index (Str: in Elastic_String) return System_Size; function Get_First_Index (Str: in Elastic_String) return System_Size;
pragma inline (Get_First_Index); pragma Inline (Get_First_Index);
-- the return type is System_Size because the Last index can be -1 off the System_Index'First. -- the return type is System_Size because the Last index can be -1 off the System_Index'First.
function Get_Last_Index (Str: in Elastic_String) return System_Size; function Get_Last_Index (Str: in Elastic_String) return System_Size;
pragma inline (Get_Last_index); pragma Inline (Get_Last_index);
function Get_Item (Str: in Elastic_String; Pos: in System_Index) return Character_Type; function Get_Item (Str: in Elastic_String; Pos: in System_Index) return Character_Type;
pragma inline (Get_Item); pragma Inline (Get_Item);
-- unsafe -- unsafe
function Get_Slot_Pointer (Str: in Elastic_String) return Thin_Character_Array_Pointer; function Get_Slot_Pointer (Str: in Elastic_String) return Thin_Character_Array_Pointer;
pragma inline (Get_Slot_Pointer); pragma Inline (Get_Slot_Pointer);
function Is_Shared(Str: in Elastic_String) return Standard.Boolean; function Is_Shared(Str: in Elastic_String) return Standard.Boolean;
pragma inline (Is_Shared); pragma Inline (Is_Shared);
procedure Purge (Str: in out Elastic_String); procedure Purge (Str: in out Elastic_String);
procedure Clear (Str: in out Elastic_String); procedure Clear (Str: in out Elastic_String);

View File

@ -1,6 +1,5 @@
with System; with System;
with System.Storage_Pools; with System.Storage_Pools;
with System.Atomic_Counters;
with Ada.Finalization; with Ada.Finalization;
package H3 is package H3 is
@ -35,21 +34,4 @@ package H3 is
function Align (X: in System_Size; Y: in System_Size) return System_Size; function Align (X: in System_Size; Y: in System_Size) return System_Size;
pragma Inline(Align); pragma Inline(Align);
-- ---------------------------------------------------------------------
-- Reference Counting
-- ---------------------------------------------------------------------
-- type Ref_Counted is abstract tagged record
-- --Ref_Count: System.Atomic_Counters.Atomic_Counter;
-- Ref_Count: System_Size;
-- end record;
-- type Ref_Counted_Pointer is access all Ref_Counted'Class;
-- type Ref is new Ada.Finalization.Controlled with record
-- Data: Ref_Counted_Pointer;
-- end record;
-- procedure Set (R: in out Ref; Data: in Ref_Counted_Pointer);
-- function Get (R: in Ref) return Ref_Counted_Pointer;
-- overriding procedure Adjust (R: in out Ref);
-- overriding procedure Finalize (R: in out Ref);
end H3; end H3;