home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
Geek Gadgets 1
/
ADE-1.bin
/
ade-dist
/
gnat-2.06-src.tgz
/
tar.out
/
fsf
/
gnat
/
ada
/
i-cporte.adb
< prev
next >
Wrap
Text File
|
1996-09-28
|
9KB
|
281 lines
------------------------------------------------------------------------------
-- --
-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS --
-- --
-- I N T E R F A C E S . C . P O S I X _ R T E --
-- --
-- B o d y --
-- --
-- $Revision: 1.6 $ --
-- --
-- Copyright (c) 1991,1992,1993,1994, FSU, All Rights Reserved --
-- --
-- GNARL is free software; you can redistribute it and/or modify it under --
-- terms of the GNU Library General Public License as published by the --
-- Free Software Foundation; either version 2, or (at your option) any --
-- later version. GNARL is distributed in the hope that it will be use- --
-- ful, but but WITHOUT ANY WARRANTY; without even the implied warranty of --
-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Gen- --
-- eral Library Public License for more details. You should have received --
-- a copy of the GNU Library General Public License along with GNARL; see --
-- file COPYING.LIB. If not, write to the Free Software Foundation, 675 --
-- Mass Ave, Cambridge, MA 02139, USA. --
-- --
------------------------------------------------------------------------------
with Interfaces.C.POSIX_Error; use Interfaces.C.Posix_Error;
-- Used for, Return_Code
with Unchecked_Conversion;
package body Interfaces.C.POSIX_RTE is
function Address_to_Pointer is new
Unchecked_Conversion (System.Address, sigaction_ptr);
function Address_to_Pointer is new
Unchecked_Conversion (System.Address, sigset_t_ptr);
function Address_to_Pointer is new
Unchecked_Conversion (System.Address, jmp_buf_ptr);
function Address_to_Pointer is new
Unchecked_Conversion (System.Address, sigjmp_buf_ptr);
-- The following are P1003.5 interfaces. I am not sure that this is a
-- good idea, but these can't be exactly the same as the C functions
-- in any case.
procedure sigaddset
(set : access Signal_Set;
sig : in Signal;
Result : out POSIX_Error.Return_Code)
is
function sigaddset_base
(set : access Signal_Set;
sig : Signal)
return Return_Code;
pragma Import (C, sigaddset_base, "sigaddset");
begin
Result := sigaddset_base (set, sig);
end sigaddset;
procedure sigdelset
(set : access Signal_Set;
sig : in Signal;
Result : out POSIX_Error.Return_Code)
is
function sigdelset_base
(set : access Signal_Set;
sig : Signal)
return Return_Code;
pragma Import (C, sigdelset_base, "sigdelset");
begin
Result := sigdelset_base (set, sig);
end sigdelset;
procedure sigfillset
(set : access Signal_Set;
Result : out POSIX_Error.Return_Code)
is
function sigfillset_base
(set : access Signal_Set)
return Return_Code;
pragma Import (C, sigfillset_base, "sigfillset");
begin
Result := sigfillset_base (set);
end sigfillset;
procedure sigemptyset
(set : access Signal_Set;
Result : out POSIX_Error.Return_Code)
is
function sigemptyset_base
(set : access Signal_Set)
return Return_Code;
pragma Import (C, sigemptyset_base, "sigemptyset");
begin
Result := sigemptyset_base (set);
end sigemptyset;
---------------
-- sigaction --
---------------
procedure sigaction
(sig : Signal;
act : access struct_sigaction;
oact : access struct_sigaction;
Result : out POSIX_Error.Return_Code)
is
function sigaction_base
(sig : Signal;
act : access struct_sigaction;
oact : access struct_sigaction) return POSIX_Error.Return_Code;
pragma Import (C, sigaction_base, "sigaction");
begin
Result := sigaction_base (sig, act, oact);
end sigaction;
---------------
-- sigaction --
---------------
procedure sigaction
(sig : Signal;
oact : access struct_sigaction;
Result : out Return_Code) is
function sigaction_base
(sig : Signal;
act : sigaction_ptr;
oact : access struct_sigaction) return Return_Code;
pragma Import (C, sigaction_base, "sigaction");
begin
Result := sigaction_base (sig, null, oact);
end sigaction;
-----------------
-- sigprocmask --
-----------------
-- Install new signal mask and obtain old one
procedure sigprocmask
(how : int;
set : access Signal_Set;
oset : access Signal_Set;
Result : out POSIX_Error.Return_Code)
is
function sigprocmask_base
(how : int;
set : access Signal_Set;
oset : access Signal_Set)
return POSIX_Error.Return_Code;
pragma Import (C, sigprocmask_base, "sigprocmask");
begin
Result := sigprocmask_base (how, set, oset);
end sigprocmask;
----------------
-- sigsuspend --
----------------
-- Suspend waiting for signals in mask and resume after
-- executing handler or take default action
procedure sigsuspend
(mask : access Signal_Set;
Result : out POSIX_Error.Return_Code) is
function sigsuspend_base
(mask : access Signal_Set)
return POSIX_Error.Return_Code;
pragma Import (C, sigsuspend_base, "sigsuspend");
begin
Result := sigsuspend_base (mask);
end sigsuspend;
----------------
-- sigpending --
----------------
-- Get pending signals on thread and process
procedure sigpending
(set : access Signal_Set;
Result : out POSIX_Error.Return_Code)
is
function sigpending_base
(set : access Signal_Set)
return POSIX_Error.Return_Code;
pragma Import (C, sigpending_base, "sigpending");
begin
Result := sigpending_base (set);
end sigpending;
-------------
-- longjmp --
-------------
-- Execute a jump across procedures according to setjmp
procedure longjmp (env : jmp_buf; val : int) is
procedure longjmp_base (env : jmp_buf_ptr; val : int);
pragma Import (C, longjmp_base, "longjmp");
begin
longjmp_base (Address_to_Pointer (env'Address), val);
end longjmp;
----------------
-- siglongjmp --
----------------
-- Execute a jump across procedures according to sigsetjmp
procedure siglongjmp (env : sigjmp_buf; val : int) is
procedure siglongjmp_base (env : sigjmp_buf_ptr; val : int);
pragma Import (C, siglongjmp_base, "siglongjmp");
begin
siglongjmp_base (Address_to_Pointer (env'Address), val);
end siglongjmp;
------------
-- setjmp --
------------
-- Set up a jump across procedures and return here with longjmp
procedure setjmp (env : jmp_buf; Result : out Return_Code) is
function setjmp_base (env : jmp_buf_ptr) return Return_Code;
pragma Import (C, setjmp_base, "setjmp");
begin
Result := setjmp_base (Address_to_Pointer (env'Address));
end setjmp;
---------------
-- sigsetjmp --
---------------
-- Set up a jump across procedures and return here with siglongjmp
procedure sigsetjmp
(env : sigjmp_buf;
savemask : int;
Result : out Return_Code)
is
function sigsetjmp_base
(env : sigjmp_buf_ptr;
savemask : int)
return Return_Code;
pragma Import (C, sigsetjmp_base, "sigsetjmp");
begin
Result := sigsetjmp_base (Address_to_Pointer (env'Address), savemask);
end sigsetjmp;
begin
for i in OS_Specific_Sync_Signals'Range loop
OS_Specific_Sync_Signals (i) :=
Signal (System_Constants.OS_Specific_Sync_Sigs (i));
end loop;
for i in OS_Specific_Async_Signals'Range loop
OS_Specific_Async_Signals (i) :=
Signal (System_Constants.OS_Specific_Async_Sigs (i));
end loop;
end Interfaces.C.POSIX_RTE;