File : posix-memory_range_locking.adb
------------------------------------------------------------------------------
-- --
-- FLORIST (FSU Implementation of POSIX.5) COMPONENTS --
-- --
-- P O S I X . M E M O R Y _ R A N G E _ L O C K I N G --
-- --
-- B o d y --
-- --
-- --
-- Copyright (c) 1996-1998 Florida State University (FSU) --
-- All Rights Reserved. --
-- --
-- This file is a component of FLORIST, an implementation of an Ada API --
-- for the POSIX OS services, for use with the GNAT Ada compiler and --
-- the FSU Gnu Ada Runtime Library (GNARL). The interface is intended --
-- to be close to that specified in IEEE STD 1003.5: 1990 and IEEE STD --
-- 1003.5b: 1996. --
-- --
-- FLORIST is free software; you can redistribute it and/or modify it --
-- under terms of the GNU General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. FLORIST is distributed in the hope that it will be --
-- useful, but WITHOUT ANY WARRANTY; without even the implied warranty --
-- of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU --
-- General Public License for more details. You should have received a --
-- copy of the GNU General Public License distributed with GNARL; see --
-- file COPYING. If not, write to the Free Software Foundation, 59 --
-- Temple Place - Suite 330, Boston, MA 02111-1307, USA. --
-- --
-- As a special exception, if other files instantiate generics from this --
-- unit, or you link this unit with other files to produce an executable, --
-- this unit does not by itself cause the resulting executable to be --
-- covered by the GNU General Public License. This exception does not --
-- however invalidate any other reasons why the executable file might be --
-- covered by the GNU Public License. --
-- --
------------------------------------------------------------------------------
-- [$Revision: 1.1.1.1 $]
with POSIX.C,
POSIX.Implementation;
package body POSIX.Memory_Range_Locking is
use POSIX.C,
POSIX.Implementation;
------------------
-- Lock_Range --
------------------
procedure Lock_Range
(First : in System.Address;
Length : in System.Storage_Elements.Storage_Offset) is
function mlock (addr : access System.Address; len : size_t) return int;
pragma Import (C, mlock, mlock_LINKNAME);
Addr : aliased System.Address := First;
begin
-- .... Some OS (eg. Solaris) has non-standard mlock/munlock.
-- For the reason if "mlock/munlock" fails with EINVAL,
-- we speculate that the OS has non-standard form of the
-- functions. So, try it again with a different form of the function.
-- .... This is not a perfact solution and we feel that this kind of
-- thing has to be resolved in the configuration management. It does its
-- work for now....
if (mlock (Addr'Unchecked_Access, size_t (Length)) = -1) and then
(Fetch_Errno = Invalid_Argument) then
declare
function mlock (addr : System.Address; len : size_t) return int;
pragma Import (C, mlock, mlock_LINKNAME);
begin
Check (mlock (Addr, size_t (Length)));
end;
else
Check (mlock (Addr'Unchecked_Access, size_t (Length)));
end if;
end Lock_Range;
--------------------
-- UnLock_Range --
--------------------
procedure Unlock_Range
(First : in System.Address;
Length : in System.Storage_Elements.Storage_Offset) is
function munlock (addr : access System.Address; len : size_t) return int;
pragma Import (C, munlock, munlock_LINKNAME);
Addr : aliased System.Address := First;
begin
if (munlock (Addr'Unchecked_Access, size_t (Length)) = -1) and then
(Fetch_Errno = Invalid_Argument) then
declare
function munlock (addr : System.Address; len : size_t) return int;
pragma Import (C, munlock, munlock_LINKNAME);
begin
Check (munlock (Addr, size_t (Length)));
end;
else
Check (munlock (Addr'Unchecked_Access, size_t (Length)));
end if;
end Unlock_Range;
end POSIX.Memory_Range_Locking;