2009-04-17 Robert Dewar <dewar@adacore.com> * s-conca5.adb, g-sercom.adb, s-conca5.ads, s-conca7.adb, exp_imgv.adb, s-conca7.ads, s-crc32.adb, s-crc32.ads, s-conca9.adb, s-conca9.ads, s-addope.adb, i-cstrin.ads, s-addope.ads, s-carun8.adb, s-carun8.ads, g-htable.ads, g-hesora.adb, g-hesora.ads, s-htable.adb, s-htable.ads, s-conca2.adb, s-conca2.ads, a-except.adb, s-conca4.adb, a-except.ads, s-conca4.ads, s-except.adb, s-except.ads, s-conca6.adb, s-conca6.ads, g-spchge.adb, g-spchge.ads, g-u3spch.adb, g-u3spch.ads, s-conca8.adb, s-conca8.ads, g-byorma.adb, g-byorma.ads, s-memory.adb, s-memory.ads, g-speche.adb, g-speche.ads, g-stsifd-sockets.adb, exp_dist.adb, s-imgenu.adb, s-imgenu.ads, s-mastop.adb, s-mastop.ads, s-exctab.adb, s-exctab.ads, s-imenne.adb, s-imenne.ads, s-casuti.adb, osint.adb, s-assert.adb, s-casuti.ads, s-assert.ads, s-os_lib.adb, s-conca3.adb, s-conca3.ads: Remove unneeded pragma Warnings From-SVN: r146263
151 lines
5.5 KiB
Ada
151 lines
5.5 KiB
Ada
------------------------------------------------------------------------------
|
|
-- --
|
|
-- GNAT RUN-TIME COMPONENTS --
|
|
-- --
|
|
-- S Y S T E M . M E M O R Y --
|
|
-- --
|
|
-- B o d y --
|
|
-- --
|
|
-- Copyright (C) 2001-2009, Free Software Foundation, Inc. --
|
|
-- --
|
|
-- GNAT is free software; you can redistribute it and/or modify it under --
|
|
-- terms of the GNU General Public License as published by the Free Soft- --
|
|
-- ware Foundation; either version 3, or (at your option) any later ver- --
|
|
-- sion. GNAT is distributed in the hope that it will be useful, but WITH- --
|
|
-- OUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY --
|
|
-- or FITNESS FOR A PARTICULAR PURPOSE. --
|
|
-- --
|
|
-- As a special exception under Section 7 of GPL version 3, you are granted --
|
|
-- additional permissions described in the GCC Runtime Library Exception, --
|
|
-- version 3.1, as published by the Free Software Foundation. --
|
|
-- --
|
|
-- You should have received a copy of the GNU General Public License and --
|
|
-- a copy of the GCC Runtime Library Exception along with this program; --
|
|
-- see the files COPYING3 and COPYING.RUNTIME respectively. If not, see --
|
|
-- <http://www.gnu.org/licenses/>. --
|
|
-- --
|
|
-- GNAT was originally developed by the GNAT team at New York University. --
|
|
-- Extensive contributions were provided by Ada Core Technologies Inc. --
|
|
-- --
|
|
------------------------------------------------------------------------------
|
|
|
|
-- This is the default implementation of this package
|
|
|
|
-- This implementation assumes that the underlying malloc/free/realloc
|
|
-- implementation is thread safe, and thus, no additional lock is required.
|
|
-- Note that we still need to defer abort because on most systems, an
|
|
-- asynchronous signal (as used for implementing asynchronous abort of
|
|
-- task) cannot safely be handled while malloc is executing.
|
|
|
|
-- If you are not using Ada constructs containing the "abort" keyword, then
|
|
-- you can remove the calls to Abort_Defer.all and Abort_Undefer.all from
|
|
-- this unit.
|
|
|
|
pragma Compiler_Unit;
|
|
|
|
with Ada.Exceptions;
|
|
with System.Soft_Links;
|
|
with System.Parameters;
|
|
with System.CRTL;
|
|
|
|
package body System.Memory is
|
|
|
|
use Ada.Exceptions;
|
|
use System.Soft_Links;
|
|
|
|
function c_malloc (Size : System.CRTL.size_t) return System.Address
|
|
renames System.CRTL.malloc;
|
|
|
|
procedure c_free (Ptr : System.Address)
|
|
renames System.CRTL.free;
|
|
|
|
function c_realloc
|
|
(Ptr : System.Address; Size : System.CRTL.size_t) return System.Address
|
|
renames System.CRTL.realloc;
|
|
|
|
-----------
|
|
-- Alloc --
|
|
-----------
|
|
|
|
function Alloc (Size : size_t) return System.Address is
|
|
Result : System.Address;
|
|
Actual_Size : size_t := Size;
|
|
|
|
begin
|
|
if Size = size_t'Last then
|
|
Raise_Exception (Storage_Error'Identity, "object too large");
|
|
end if;
|
|
|
|
-- Change size from zero to non-zero. We still want a proper pointer
|
|
-- for the zero case because pointers to zero length objects have to
|
|
-- be distinct, but we can't just go ahead and allocate zero bytes,
|
|
-- since some malloc's return zero for a zero argument.
|
|
|
|
if Size = 0 then
|
|
Actual_Size := 1;
|
|
end if;
|
|
|
|
if Parameters.No_Abort then
|
|
Result := c_malloc (System.CRTL.size_t (Actual_Size));
|
|
else
|
|
Abort_Defer.all;
|
|
Result := c_malloc (System.CRTL.size_t (Actual_Size));
|
|
Abort_Undefer.all;
|
|
end if;
|
|
|
|
if Result = System.Null_Address then
|
|
Raise_Exception (Storage_Error'Identity, "heap exhausted");
|
|
end if;
|
|
|
|
return Result;
|
|
end Alloc;
|
|
|
|
----------
|
|
-- Free --
|
|
----------
|
|
|
|
procedure Free (Ptr : System.Address) is
|
|
begin
|
|
if Parameters.No_Abort then
|
|
c_free (Ptr);
|
|
else
|
|
Abort_Defer.all;
|
|
c_free (Ptr);
|
|
Abort_Undefer.all;
|
|
end if;
|
|
end Free;
|
|
|
|
-------------
|
|
-- Realloc --
|
|
-------------
|
|
|
|
function Realloc
|
|
(Ptr : System.Address;
|
|
Size : size_t)
|
|
return System.Address
|
|
is
|
|
Result : System.Address;
|
|
Actual_Size : constant size_t := Size;
|
|
|
|
begin
|
|
if Size = size_t'Last then
|
|
Raise_Exception (Storage_Error'Identity, "object too large");
|
|
end if;
|
|
|
|
if Parameters.No_Abort then
|
|
Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
|
|
else
|
|
Abort_Defer.all;
|
|
Result := c_realloc (Ptr, System.CRTL.size_t (Actual_Size));
|
|
Abort_Undefer.all;
|
|
end if;
|
|
|
|
if Result = System.Null_Address then
|
|
Raise_Exception (Storage_Error'Identity, "heap exhausted");
|
|
end if;
|
|
|
|
return Result;
|
|
end Realloc;
|
|
|
|
end System.Memory;
|