67 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
			
		
		
	
	
			67 lines
		
	
	
		
			2.9 KiB
		
	
	
	
		
			Ada
		
	
	
	
	
	
| with System;
 | |
| --with System.Address_Image;
 | |
| 
 | |
| 
 | |
| with Ada.Text_IO;
 | |
| 
 | |
| package body Storage is
 | |
| 
 | |
| 	type Size_T is mod 2 ** System.Word_Size;
 | |
| 
 | |
| 	function Sys_Malloc (Size: Size_T) return System.Address;
 | |
| 	--pragma Import (C, Sys_Malloc, Link_Name => "malloc");
 | |
| 	pragma Import (Convention => C, Entity => Sys_Malloc, External_Name => "malloc");
 | |
| 
 | |
| 	procedure Sys_Free (Ptr: System.Address);
 | |
| 	--pragma Import (C, Sys_Free, Link_Name => "free");
 | |
| 	pragma Import (Convention => C, Entity => Sys_Free, External_Name => "free");
 | |
| 
 | |
| 	procedure Allocate (Pool: in out Global_Pool; Address : out System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count) is
 | |
| 		tmp: System.Address;
 | |
| 		use type SSE.Storage_Count;
 | |
| 	begin
 | |
| Ada.Text_IO.Put_Line ("QSE.Global_Pool Allocating " & SSE.Storage_Count'Image (Size) & " " & SSE.Storage_Count'Image (((Size + Alignment - 1) / Alignment) * Alignment));
 | |
| 		tmp := Sys_Malloc (Size_T(((Size + Alignment - 1) / Alignment) * Alignment));
 | |
| 		if System."=" (tmp, System.Null_Address) then
 | |
| 			raise Storage_Error;
 | |
| 		else
 | |
| 			Address := tmp;
 | |
| --Ada.Text_IO.Put_Line ("QSE.Global_Pool Returning " & System.Address_Image (Address));
 | |
| 		end if;
 | |
| 	end Allocate;
 | |
| 
 | |
| 	procedure Deallocate (Pool: in out Global_Pool; Address : in System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count) is
 | |
| 	begin
 | |
| Ada.Text_IO.Put_Line ("QSE.Global_Pool Deallocating ");
 | |
| --Ada.Text_IO.Put_Line ("QSE.Global_Pool Deallocating " & System.Address_Image (Address));
 | |
| 		Sys_Free (Address);
 | |
| 	end Deallocate;
 | |
| 
 | |
| 	function Storage_Size (Pool: in Global_Pool) return SSE.Storage_Count is
 | |
| 	begin
 | |
| Ada.Text_IO.Put_Line ("QSE.Global_Pool Storage_Size ");
 | |
| 		return SSE.Storage_Count'Last;
 | |
| 	end Storage_Size;
 | |
| 
 | |
| 
 | |
| 	-- TODO: find a better solution
 | |
| 	-- gnat 3.15p somehow looks for the rountines below when H2.Pool is used.
 | |
| 	-- let me put these routines here temporarily until i find a proper solution.
 | |
| 	procedure Allocate_315P (Pool: in out SSP.Root_Storage_Pool'Class; Address : out System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count);
 | |
| 	pragma Export (Ada, Allocate_315P, "system__storage_pools__allocate");
 | |
| 	procedure Allocate_315P (Pool: in out SSP.Root_Storage_Pool'Class; Address : out System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count) is
 | |
| 	begin
 | |
| ada.text_io.put_line ("system__storage_pools__allocate...");
 | |
| 		SSP.Allocate (Pool, Address, Size, Alignment);
 | |
| 	end Allocate_315P;
 | |
| 
 | |
| 	procedure Deallocate_315P (Pool: in out SSP.Root_Storage_Pool'Class; Address : in System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count);
 | |
| 	pragma Export (Ada, Deallocate_315P, "system__storage_pools__deallocate");
 | |
| 	procedure Deallocate_315P (Pool: in out SSP.Root_Storage_Pool'Class; Address : in System.Address; Size: in SSE.Storage_Count; Alignment: in SSE.Storage_Count) is
 | |
| 	begin
 | |
| ada.text_io.put_line ("system__storage_pools__deallocate...");
 | |
| 		SSP.Deallocate (Pool, Address, Size, Alignment);
 | |
| 	end Deallocate_315P;
 | |
| end Storage;
 | |
| 
 |