|
|
DataMuseum.dkPresents historical artifacts from the history of: Rational R1000/400 Tapes |
This is an automatic "excavation" of a thematic subset of
See our Wiki for more about Rational R1000/400 Tapes Excavated with: AutoArchaeologist - Free & Open Source Software. |
top - metrics - downloadIndex: B T
Length: 4353 (0x1101)
Types: TextFile
Names: »B«
└─⟦afbc8121e⟧ Bits:30000532 8mm tape, Rational 1000, MC68020_OS2000 7_2_2
└─⟦77aa8350c⟧ »DATA«
└─⟦f794ecd1d⟧
└─⟦24d1ddd49⟧
└─⟦this⟧
-- The use of this system is subject to the software license terms and
-- conditions agreed upon between Rational and the Customer.
--
-- Copyright 1988 by Rational.
--
-- RESTRICTED RIGHTS LEGEND
--
-- Use, duplication, or disclosure by the Government is subject to
-- restrictions as set forth in subdivision (b)(3)(ii) of the Rights in
-- Technical Data and Computer Software clause at 52.227-7013.
--
--
-- Rational
-- 3320 Scott Boulevard
-- Santa Clara, California 95054-3197
--
-- PROPRIETARY AND CONFIDENTIAL INFORMATION OF RATIONAL;
-- USE OR COPYING WITHOUT EXPRESS WRITTEN AUTHORIZATION
-- IS STRICTLY PROHIBITED. THIS MATERIAL IS PROTECTED AS
-- AN UNPUBLISHED WORK UNDER THE U.S. COPYRIGHT ACT OF
-- 1976. CREATED 1988. ALL RIGHTS RESERVED.
--
--
with Debug_Definitions;
with Debug_Io;
with Runtime_Error;
package body Heap_Management is
pragma Suppress (Storage_Check);
use System_Definitions.Operators;
use Runtime_Error.Values;
Heap_Size : Natural;
pragma Import_Object (Heap_Size, "__HEAP_SIZE_VAR");
Heap_Ptr : Address;
pragma Import_Object (Heap_Ptr, "__HEAP_PTR");
Next_Available : Address;
pragma Import_Object (Next_Available, "__HEAP_NEXT_AVAILABLE");
First_Unavailable : Address; -- Heap_Ptr + Heap_Size;
pragma Import_Object (First_Unavailable, "__HEAP_FIRST_UNAVAILABLE");
-- Debug_Mode : Boolean := Debug_Definitions.Debug_Storage_Management;
package Heap_Support is
function Atomic_Add (Sum_Ref : Address;
Addend : Integer;
Maximum : Address) return Address;
--
-- if Sum_Ref.all + Addend <= Maximum then
-- return Sum_Ref.all and
-- Sum_Ref.all := Sum_Ref.all + Addend;
--
function Heap_Align (A : Address) return Address;
private
pragma Interface (Asm, Atomic_Add);
pragma Import_Function (Atomic_Add, "__ATOMIC_ADD_BOUNDED",
Mechanism => (Value, Value, Value));
pragma Interface (Asm, Heap_Align);
pragma Import_Function
(Heap_Align, "__HEAP_ALIGN_VALUE", Mechanism => (Value));
end Heap_Support;
function Allocate (Size : Integer) return Address is
pragma Routine_Number (Runtime_Ids.Internal);
Result : Address;
begin
-- if Debug_Mode then
-- Debug_Io.New_Line;
-- Debug_Io.Put_Line ("Entered Heap_Management.Allocate");
-- Debug_Io.Put_Line (" Size =" & Integer'Image (Size));
-- Debug_Io.Put_Line (" First_Available =" &
-- Integer'Image (To_Integer (Next_Available)));
-- Debug_Io.Put_Line (" First_Unavailable =" &
-- Integer'Image (To_Integer (First_Unavailable)));
-- end if;
Result := Heap_Support.Atomic_Add
(Next_Available'Address, Size, First_Unavailable);
if To_Integer (Result) = 0 then
Runtime_Error.Issue (Heap_Exhausted_For_Program);
-- if Debug_Mode then
-- Debug_Io.Put_Line
-- ("Heap_Management.Allocate unable to allocate a block of size" &
-- Integer'Image (Size) & "; returning null");
-- Debug_Io.Put_Line (" available storage =" &
-- Integer'Image (To_Integer
-- (First_Unavailable) -
-- To_Integer (Next_Available)));
-- end if;
end if;
-- if Debug_Mode then
-- Debug_Io.Put_Line (" Heap_Management.Allocate returning" &
-- Integer'Image (To_Integer (Result)));
-- end if;
return Result;
end Allocate;
begin
Next_Available := Heap_Support.Heap_Align (Heap_Ptr);
First_Unavailable := Plus_Ai (Next_Available, Heap_Size);
end Heap_Management;
pragma Export_Elaboration_Procedure ("__HEAP_MGMT_BODY_ELAB");
pragma Runtime_Unit (Unit_Number => Runtime_Ids.Runtime_Compunit,
Elab_Routine_Number => Runtime_Ids.Internal);