diff options
author | Satoshi Asami <asami@FreeBSD.org> | 1997-09-25 08:48:00 +0000 |
---|---|---|
committer | Satoshi Asami <asami@FreeBSD.org> | 1997-09-25 08:48:00 +0000 |
commit | 31f08be6a309375d03f730cefdbae2a6ad49d1d5 (patch) | |
tree | faa7a768db1892a98dce84bf352d0c9665f6c2d1 /lang/gnat/files | |
parent | 9b7d271eca2966603e8c37ea1edcc17a3635f35c (diff) |
Notes
Diffstat (limited to 'lang/gnat/files')
-rw-r--r-- | lang/gnat/files/4fintnam.ads | 154 | ||||
-rw-r--r-- | lang/gnat/files/5fintman.adb | 234 | ||||
-rw-r--r-- | lang/gnat/files/5fosinte.adb | 139 | ||||
-rw-r--r-- | lang/gnat/files/5fosinte.ads | 742 | ||||
-rw-r--r-- | lang/gnat/files/5ftaprop.adb | 779 | ||||
-rw-r--r-- | lang/gnat/files/5ftaspri.ads | 138 | ||||
-rw-r--r-- | lang/gnat/files/patch-aa | 141 | ||||
-rw-r--r-- | lang/gnat/files/patch-ab | 36 | ||||
-rw-r--r-- | lang/gnat/files/patch-ac | 20 | ||||
-rw-r--r-- | lang/gnat/files/patch-ad | 46 | ||||
-rw-r--r-- | lang/gnat/files/patch-ae | 36 | ||||
-rw-r--r-- | lang/gnat/files/patch-af | 19 |
12 files changed, 2484 insertions, 0 deletions
diff --git a/lang/gnat/files/4fintnam.ads b/lang/gnat/files/4fintnam.ads new file mode 100644 index 000000000000..29f53e62ae96 --- /dev/null +++ b/lang/gnat/files/4fintnam.ads @@ -0,0 +1,154 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- A D A . I N T E R R U P T S . N A M E S -- +-- -- +-- S p e c -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.1 $ -- +-- -- +-- Copyright (C) 1991,92,93,94,95,1996 Free Software Foundation, Inc. -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD THREADS version of this package + +-- This is only a first approximation. +-- It should be autogenerated by the m4 macro processor. +-- Contributed by Daniel Eischen (deischen@iworks.InterWorks.org) + +with System.OS_Interface; +-- used for names of interrupts + +package Ada.Interrupts.Names is + + + SIGHUP : constant Interrupt_ID := + System.OS_Interface.SIGHUP; -- hangup + + SIGINT : constant Interrupt_ID := + System.OS_Interface.SIGINT; -- interrupt (rubout) + + SIGQUIT : constant Interrupt_ID := + System.OS_Interface.SIGQUIT; -- quit (ASCD FS) + + SIGILL : constant Interrupt_ID := + System.OS_Interface.SIGILL; -- illegal instruction (not reset) + + SIGTRAP : constant Interrupt_ID := + System.OS_Interface.SIGTRAP; -- trace trap (not reset) + + SIGIOT : constant Interrupt_ID := + System.OS_Interface.SIGIOT; -- IOT instruction + + SIGABRT : constant Interrupt_ID := -- used by abort, + System.OS_Interface.SIGABRT; -- replace SIGIOT in the future + + SIGEMT : constant Interrupt_ID := + System.OS_Interface.SIGEMT; -- EMT instruction + + SIGFPE : constant Interrupt_ID := + System.OS_Interface.SIGFPE; -- floating point exception + + SIGKILL : constant Interrupt_ID := + System.OS_Interface.SIGKILL; -- kill (cannot be caught or ignored) + + SIGBUS : constant Interrupt_ID := + System.OS_Interface.SIGBUS; -- bus error + + SIGSEGV : constant Interrupt_ID := + System.OS_Interface.SIGSEGV; -- segmentation violation + + SIGSYS : constant Interrupt_ID := + System.OS_Interface.SIGSYS; -- bad argument to system call + + SIGPIPE : constant Interrupt_ID := -- write on a pipe with + System.OS_Interface.SIGPIPE; -- no one to read it + + SIGALRM : constant Interrupt_ID := + System.OS_Interface.SIGALRM; -- alarm clock + + SIGTERM : constant Interrupt_ID := + System.OS_Interface.SIGTERM; -- software termination signal from kill + + SIGURG : constant Interrupt_ID := + System.OS_Interface.SIGURG; -- urgent condition on IO channel + + SIGSTOP : constant Interrupt_ID := + System.OS_Interface.SIGSTOP; -- stop (cannot be caught or ignored) + + SIGTSTP : constant Interrupt_ID := + System.OS_Interface.SIGTSTP; -- user stop requested from tty + + SIGCONT : constant Interrupt_ID := + System.OS_Interface.SIGCONT; -- stopped process has been continued + + SIGCHLD : constant Interrupt_ID := + System.OS_Interface.SIGCHLD; -- 4.3BSD's/POSIX name for SIGCLD + + SIGCLD : constant Interrupt_ID := + System.OS_Interface.SIGCLD; -- child status change + + SIGTTIN : constant Interrupt_ID := + System.OS_Interface.SIGTTIN; -- background tty read attempted + + SIGTTOU : constant Interrupt_ID := + System.OS_Interface.SIGTTOU; -- background tty write attempted + + SIGIO : constant Interrupt_ID := -- input/output possible, + System.OS_Interface.SIGIO; -- SIGPOLL alias (Solaris) + + SIGXCPU : constant Interrupt_ID := + System.OS_Interface.SIGXCPU; -- CPU time limit exceeded + + SIGXFSZ : constant Interrupt_ID := + System.OS_Interface.SIGXFSZ; -- filesize limit exceeded + + SIGVTALRM : constant Interrupt_ID := + System.OS_Interface.SIGVTALRM; -- virtual timer expired + + SIGPROF : constant Interrupt_ID := + System.OS_Interface.SIGPROF; -- profiling timer expired + + SIGWINCH : constant Interrupt_ID := + System.OS_Interface.SIGWINCH; -- window size change + + SIGINFO : constant Interrupt_ID := -- information request + System.OS_Interface.SIGINFO; -- (NetBSD/FreeBSD) + + SIGUSR1 : constant Interrupt_ID := + System.OS_Interface.SIGUSR1; -- user defined signal 1 + + SIGUSR2 : constant Interrupt_ID := + System.OS_Interface.SIGUSR2; -- user defined signal 2 + + -- Beware that the mapping of names to signals may be + -- many-to-one. There may be aliases. Also, for all + -- signal names that are not supported on the current system + -- the value of the corresponding constant will be zero. + +end Ada.Interrupts.Names; diff --git a/lang/gnat/files/5fintman.adb b/lang/gnat/files/5fintman.adb new file mode 100644 index 000000000000..10e3db9af325 --- /dev/null +++ b/lang/gnat/files/5fintman.adb @@ -0,0 +1,234 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- S Y S T E M . I N T E R R U P T _ M A N A G E M E N T -- +-- -- +-- B o d y -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.3 $ -- +-- -- +-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD PTHREADS version of this package + +-- This is only a first approximation. +-- It should be autogenerated by the m4 macro processor. +-- Contributed by Peter Burwood (gnat@arcangel.dircon.co.uk). + +-- This file performs the system-dependent translation between machine +-- exceptions and the Ada exceptions, if any, that should be raised when +-- they occur. This version works for FreeBSD. Contributed by +-- Daniel M. Eischen (deischen@iworks.InterWorks.org). + +-- PLEASE DO NOT add any dependences on other packages. +-- This package is designed to work with or without tasking support. + +-- See the other warnings in the package specification before making +-- any modifications to this file. + +-- Make a careful study of all signals available under the OS, +-- to see which need to be reserved, kept always unmasked, +-- or kept always unmasked. +-- Be on the lookout for special signals that +-- may be used by the thread library. + +with Interfaces.C; +-- used for int and other types + +with System.Error_Reporting; +-- used for Shutdown + +with System.OS_Interface; +-- used for various Constants, Signal and types + +package body System.Interrupt_Management is + + use Interfaces.C; + use System.Error_Reporting; + use System.OS_Interface; + + type Interrupt_List is array (Interrupt_ID range <>) of Interrupt_ID; + Exception_Interrupts : constant Interrupt_List := + (SIGFPE, SIGILL, SIGSEGV, SIGBUS); + + + ---------------------- + -- Notify_Exception -- + ---------------------- + + -- This function identifies the Ada exception to be raised using + -- the information when the system received a synchronous signal. + -- Since this function is machine and OS dependent, different code + -- has to be provided for different target. + + -- Language specs say signal handlers take exactly one arg, even + -- though FreeBSD actually supplies three. Ugh! + + procedure Notify_Exception + (signo : Signal; + code : Interfaces.C.int; + context : access struct_sigcontext); + + procedure Notify_Exception + (signo : Signal; + code : Interfaces.C.int; + context : access struct_sigcontext) is + begin + + -- As long as we are using a longjmp to return control to the + -- exception handler on the runtime stack, we are safe. The original + -- signal mask (the one we had before coming into this signal catching + -- function) will be restored by the longjmp. Therefore, raising + -- an exception in this handler should be a safe operation. + + -- Check that treatment of exception propagation here + -- is consistent with treatment of the abort signal in + -- System.Task_Primitives.Operations. + + -- ????? + -- The code below is first approximation. + -- It would be nice to figure out more + -- precisely what exception has occurred. + -- One also should arrange to use an alternate stack for + -- recovery from stack overflow. + -- I don't understand the Linux kernel code well + -- enough to figure out how to do this yet. + -- I hope someone will look at this. --Ted Baker + + -- How can SIGSEGV be split into constraint and storage errors ? + -- What should SIGILL really raise ? Some implemenations have + -- codes for different types of SIGILL and some raise Storage_Error. + -- What causes SIGBUS and should it be caught ? + -- Peter Burwood + + case signo is + when SIGFPE => + raise Constraint_Error; + when SIGILL => + raise Constraint_Error; + when SIGSEGV => + raise Storage_Error; + when SIGBUS => + raise Storage_Error; + when others => + pragma Assert (Shutdown ("Unexpected signal")); + null; + end case; + end Notify_Exception; + + ---------------- + -- Initialize -- + ---------------- + + procedure Initialize is + act : aliased struct_sigaction; + old_act : aliased struct_sigaction; + mask : aliased sigset_t; + Result : Interfaces.C.int; + + begin + + Abort_Task_Interrupt := SIGABRT; + -- Change this if you want to use another signal for task abort. + -- SIGTERM might be a good one. + + act.sa_handler := Notify_Exception'Address; + + act.sa_flags := 16#010#; + -- Set sa_flags to SA_NODEFER so that during the handler execution + -- we do not change the Signal_Mask to be masked for the Signal. + -- This is a temporary fix to the problem that the Signal_Mask is + -- not restored after the exception (longjmp) from the handler. + -- The right fix should be made in sigsetjmp so that we save + -- the Signal_Set and restore it after a longjmp. + -- In that case, this field should be changed back to 0. ??? (Dong-Ik) + + Result := sigemptyset (mask'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---sigemptyset")); + + for I in Exception_Interrupts'Range loop + Result := sigaddset (mask'Access, Signal (Exception_Interrupts (I))); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---sigaddset")); + end loop; + + act.sa_mask := mask; + + for I in Exception_Interrupts'Range loop + Keep_Unmasked (Exception_Interrupts (I)) := True; + Result := + sigaction + (Signal (Exception_Interrupts (I)), act'Access, old_act'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---sigaction")); + end loop; + + Keep_Unmasked (Abort_Task_Interrupt) := true; +-- Keep_Unmasked (SIGBUS) := true; + + Keep_Unmasked (SIGSTOP) := true; + Keep_Unmasked (SIGKILL) := true; + Keep_Unmasked (SIGINT) := true; + + -- Keep_Unmasked (SIGEMT) := true; + -- Keep_Unmasked (SIGCHLD) := true; + -- Keep_Unmasked (SIGALRM) := true; + -- ???? The above signals have been found to need to be + -- kept unmasked on some systems, per Dong-Ik Oh. + -- I don't know whether the MIT/Provenzano threads + -- need these or any other signals unmasked at the thread level. + -- I hope somebody will take + -- the time to look it up. -- Ted Baker + + -- FreeBSD uses SIGINFO to dump thread status to stdout. If + -- the user really wants to attach his own handler, let him. + + -- FreeBSD pthreads uses setitimer/getitimer for thread scheduling. + -- It's not clear, but it looks as if it only needs SIGVTALRM + -- in order to handle the setitimer/getitimer operations. We + -- could probably allow SIGALARM, but we'll leave it as unmasked + -- for now. FreeBSD pthreads also needs SIGCHLD. + Keep_Unmasked (SIGCHLD) := true; + Keep_Unmasked (SIGALRM) := true; + Keep_Unmasked (SIGVTALRM) := true; + + Reserve := Reserve or Keep_Unmasked or Keep_Masked; + + Reserve (0) := true; + -- We do not have Signal 0 in reality. We just use this value + -- to identify non-existent signals (see s-intnam.ads). Therefore, + -- Signal 0 should not be used in all signal related operations hence + -- mark it as reserved. + + end Initialize; + +begin + Initialize; +end System.Interrupt_Management; diff --git a/lang/gnat/files/5fosinte.adb b/lang/gnat/files/5fosinte.adb new file mode 100644 index 000000000000..33d4bcfd2b89 --- /dev/null +++ b/lang/gnat/files/5fosinte.adb @@ -0,0 +1,139 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- S Y S T E M . O S _ I N T E R F A C E -- +-- -- +-- B o d y -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.2 $ -- +-- -- +-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD THREADS version of this package + +-- This is only a first approximation. +-- It should be autogenerated by the m4 macro processor. +-- Contributed by Daniel M. Eischen (deischen@iworks.InterWorks.org) + +-- DO NOT EDIT this file. +-- It was automatically generated from another file by the m4 macro processor. +-- The name of the file you should edit is the same as this one, but with +-- ".ads" replaced by ".sm4", or +-- ".adb" replaced by ".bm4", or +-- ".c" replaced by ".cm4", or +-- ".dat" replaced by ".tm4" + +-- Local options selected: +-- __TARGET = i386-unknown-freebsd +-- __ARCH = I386 +-- __OS = FREEBSD +-- __HAS_SIGCONTEXT = 1 +-- __HAS_UCONTEXT = 0 +-- __THREADS = POSIX_THREADS +-- __THREAD_VARIANT = ?? +-- __HAS_TIMESPEC = 1 +-- __HAS_NANOSLEEP = 1 +-- __HAS_CLOCK_GETTIME = 0 +-- __HAS_GETTIMEOFDAY = 1 +-- __POSIX_THREAD_PRIO_PROTECT = 0 +-- __POSIX_THREAD_PRIO_INHERIT = 0 +-- __POSIX_THREAD_ATTR_STACKADDR = 1 +-- __POSIX_THREAD_ATTR_STACKSIZE = 1 +-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0 + +-- This package encapsulates all direct interfaces to OS services +-- that are needed by children of System. + +-- This version is for POSIX-like operating systems +-- The original file "s-osinte.ads_m4" contains conditional +-- macro calls that allow selection of various options. + +with Interfaces.C; use Interfaces.C; +package body System.OS_Interface is + + ----------------- + -- To_Duration -- + ----------------- + + function To_Duration (TS : timespec) return Duration is + begin + return Duration (TS.ts_sec) + Duration (TS.ts_nsec) / 10#1#E9; + end To_Duration; + + ----------------- + -- To_Timespec -- + ----------------- + + function To_Timespec (D : Duration) return timespec is + S : time_t; + F : Duration; + begin + S := time_t (Long_Long_Integer (D)); + F := D - Duration (S); + + -- If F has negative value due to a round-up, adjust for positive F + -- value. + if F < 0.0 then S := S - 1; F := F + 1.0; end if; + return timespec' (ts_sec => S, + ts_nsec => long (Long_Long_Integer (F * 10#1#E9))); + end To_Timespec; + + + function To_Duration (TV : struct_timeval) return Duration is + begin + return Duration (TV.tv_sec) + Duration (TV.tv_usec) / 10#1#E6; + end To_Duration; + + function To_Timeval (D : Duration) return struct_timeval is + S : long; + F : Duration; + begin + S := long (Long_Long_Integer (D)); + F := D - Duration (S); + + -- If F has negative value due to a round-up, adjust for positive F + -- value. + if F < 0.0 then S := S - 1; F := F + 1.0; end if; + return struct_timeval' (tv_sec => S, + tv_usec => long (Long_Long_Integer (F * 10#1#E6))); + end To_Timeval; + + -- FreeBSD Pthreads has pthread_yield and it is imported as + -- sched_yield in 5fosinte.ads. The FreeBSD pthread_yield does + -- not have any parameters, so the import may be used directly + -- without the need for a wrapper as shown below. +-- function sched_yield return int is +-- procedure sched_yield_base (arg : System.Address); +-- pragma Import (C, sched_yield_base, "pthread_yield"); +-- begin +-- sched_yield_base (System.Null_Address); +-- return 0; +-- end sched_yield; + +end System.OS_Interface; diff --git a/lang/gnat/files/5fosinte.ads b/lang/gnat/files/5fosinte.ads new file mode 100644 index 000000000000..14450cce307a --- /dev/null +++ b/lang/gnat/files/5fosinte.ads @@ -0,0 +1,742 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- S Y S T E M . O S _ I N T E R F A C E -- +-- -- +-- S p e c -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.5 $ -- +-- -- +-- Copyright (C) 1991,92,93,94,95,1996 Free Software Foundation, Inc. -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD PTHREADS version of this package + +-- This is only a first approximation. +-- It should be autogenerated by the m4 macro processor. +-- Contributed by Daniel Eischen (deischen@iworks.InterWorks.org) + +-- DO NOT EDIT this file. +-- It was automatically generated from another file by the m4 macro processor. +-- The name of the file you should edit is the same as this one, but with +-- ".ads" replaced by ".sm4", or +-- ".adb" replaced by ".bm4", or +-- ".c" replaced by ".cm4", or +-- ".dat" replaced by ".tm4" + +-- Local options selected: +-- __TARGET = i386-unknown-freebsd +-- __ARCH = I386 +-- __OS = FREEBSD +-- __HAS_SIGCONTEXT = 1 +-- __HAS_UCONTEXT = 0 +-- __THREADS = POSIX_THREADS +-- __THREAD_VARIANT = ?? +-- __HAS_TIMESPEC = 1 +-- __HAS_NANOSLEEP = 1 +-- __HAS_CLOCK_GETTIME = 0 +-- __HAS_GETTIMEOFDAY = 1 +-- __POSIX_THREAD_PRIO_PROTECT = 0 +-- __POSIX_THREAD_PRIO_INHERIT = 0 +-- __POSIX_THREAD_ATTR_STACKADDR = 1 +-- __POSIX_THREAD_ATTR_STACKSIZE = 1 +-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0 + +-- This package encapsulates all direct interfaces to OS services +-- that are needed by children of System. + +-- PLEASE DO NOT add any with-clauses to this package +-- or remove the pragma Elaborate_Body. +-- It is designed to be a bottom-level (leaf) package. + +-- This version is for POSIX-like operating systems +-- The original file "s-osinte.sm4" contains conditional +-- macro calls that allow selection of various options. +-- The options selected for this expansion were: + +-- When adding new signals to s-osinte.sm4, don't forget to update +-- cconst.dat (m4 macro definition data-file) and the files +-- s-intnam.ads (package Ada.Interrupt_Names) for the various ports. + +with Interfaces.C; +package System.OS_Interface is + pragma Preelaborate; + + pragma Linker_Options ("-lc_r"); + + subtype int is Interfaces.C.int; + subtype short is Interfaces.C.short; + subtype long is Interfaces.C.long; + subtype unsigned is Interfaces.C.unsigned; + subtype unsigned_short is Interfaces.C.unsigned_short; + subtype unsigned_long is Interfaces.C.unsigned_long; + subtype unsigned_char is Interfaces.C.unsigned_char; + subtype plain_char is Interfaces.C.plain_char; + subtype size_t is Interfaces.C.size_t; + + ----------- + -- Errno -- + ----------- + + function errno return int; + pragma Import (C, errno, "__get_errno"); + + -- NAMEs not used are commented-out + -- NAMEs not supported on this system have __NAME for value + + -- E2BIG : constant := 7; + -- EACCES : constant := 13; + EAGAIN : constant := 35; + -- EBADF : constant := 9; + -- EBUSY : constant := 16; + -- ECHILD : constant := 10; + -- EDEADLK : constant := 11; + -- EDOM : constant := 33; + -- EEXIST : constant := 17; + -- EFAULT : constant := 14; + -- EFBIG : constant := 27; + EINTR : constant := 4; + EINVAL : constant := 22; + -- EIO : constant := 5; + -- EISDIR : constant := 21; + -- EMFILE : constant := 24; + -- EMLINK : constant := 31; + -- ENAMETOOLONG : constant := 63; + -- ENFILE : constant := 23; + -- ENODEV : constant := 19; + -- ENOENT : constant := 2; + -- ENOEXEC : constant := 8; + -- ENOLCK : constant := 37; + ENOMEM : constant := 12; + -- ENOSPC : constant := 28; + -- ENOSYS : constant := 78; + -- ENOTDIR : constant := 20; + -- ENOTEMPTY : constant := 66; + -- ENOTTY : constant := 25; + -- ENXIO : constant := 6; + -- EPERM : constant := 1; + -- EPIPE : constant := 32; + -- ERANGE : constant := 34; + -- EROFS : constant := 30; + -- ESPIPE : constant := 29; + -- ESRCH : constant := 3; + ETIMEDOUT : constant := 60; + -- EXDEV : constant := 18; + + ------------- + -- Signals -- + ------------- + + NSIG : constant := 32; + type Signal is new int range 0 .. Interfaces.C."-" (NSIG, 1); + + -- NAMEs not used are commented-out + -- NAMEs not supported on this system have __NAME for value + + SIGHUP : constant := 1; -- hangup + SIGINT : constant := 2; -- interrupt (rubout) + SIGQUIT : constant := 3; -- quit (ASCD FS) + SIGILL : constant := 4; -- illegal instruction (not reset) + SIGTRAP : constant := 5; -- trace trap (not reset) + SIGIOT : constant := 6; -- IOT instruction + SIGABRT : constant := 6; -- used by abort, replace SIGIOT in the future + SIGEMT : constant := 7; -- EMT instruction + SIGFPE : constant := 8; -- floating point exception + SIGKILL : constant := 9; -- kill (cannot be caught or ignored) + SIGBUS : constant := 10; -- bus error + SIGSEGV : constant := 11; -- segmentation violation + SIGSYS : constant := 12; -- bad argument to system call + SIGPIPE : constant := 13; -- write on a pipe with no one to read it + SIGALRM : constant := 14; -- alarm clock + SIGTERM : constant := 15; -- software termination signal from kill + SIGURG : constant := 16; -- urgent condition on IO channel + SIGSTOP : constant := 17; -- stop (cannot be caught or ignored) + SIGTSTP : constant := 18; -- user stop requested from tty + SIGCONT : constant := 19; -- stopped process has been continued + SIGCLD : constant := 20; -- alias for SIGCHLD + SIGCHLD : constant := 20; -- child status change + SIGTTIN : constant := 21; -- background tty read attempted + SIGTTOU : constant := 22; -- background tty write attempted + SIGIO : constant := 23; -- I/O possible (Solaris SIGPOLL alias) + SIGXCPU : constant := 24; -- CPU time limit exceeded + SIGXFSZ : constant := 25; -- filesize limit exceeded + SIGVTALRM : constant := 26; -- virtual timer expired + SIGPROF : constant := 27; -- profiling timer expired + SIGWINCH : constant := 28; -- window size change + SIGINFO : constant := 29; -- information request (NetBSD/FreeBSD) + SIGUSR1 : constant := 30; -- user defined signal 1 + SIGUSR2 : constant := 31; -- user defined signal 2 + + type sigset_t is private; + + function sigaddset + (set : access sigset_t; + sig : Signal) + return int; + pragma Import (C, sigaddset, "sigaddset"); + + function sigdelset + (set : access sigset_t; + sig : Signal) + return int; + pragma Import (C, sigdelset, "sigdelset"); + + function sigfillset + (set : access sigset_t) + return int; + pragma Import (C, sigfillset, "sigfillset"); + + function sigismember + (set : access sigset_t; + sig : Signal) + return int; + pragma Import (C, sigismember, "sigismember"); + + function sigemptyset + (set : access sigset_t) + return int; + pragma Import (C, sigemptyset, "sigemptyset"); + + -- sigcontext is architecture dependent, so define it private + type struct_sigcontext is private; + + type struct_sigaction is record + sa_handler : System.Address; + sa_mask : sigset_t; + sa_flags : int; + end record; + pragma Convention (C, struct_sigaction); + + + SIG_BLOCK : constant := 1; + SIG_UNBLOCK : constant := 2; + SIG_SETMASK : constant := 3; + + -- SA_NOCLDSTOP : constant := 8; + -- not used + -- SA_SIGINFO : constant := __SA_SIGINFO; + -- not used + + SIG_DFL : constant := 0; + SIG_IGN : constant := 1; + -- SIG_ERR : constatn := -1; + -- not used + + function sigaction + (sig : Signal; + act : access struct_sigaction; + oact : access struct_sigaction) + return int; + pragma Import (C, sigaction, "sigaction"); + + ---------- + -- Time -- + ---------- + + type timespec is private; + + function nanosleep (rqtp, rmtp : access timespec) return int; + pragma Import (C, nanosleep, "nanosleep"); + + function To_Duration (TS : timespec) return Duration; + pragma Inline (To_Duration); + + function To_Timespec (D : Duration) return timespec; + pragma Inline (To_Timespec); + + type struct_timezone is record + tz_minuteswest : int; + tz_dsttime : int; + end record; + pragma Convention (C, struct_timezone); + type struct_timeval is private; + -- This is needed on systems that do not have clock_gettime() + -- but do have gettimeofday(). + + function To_Duration (TV : struct_timeval) return Duration; + pragma Inline (To_Duration); + + function To_Timeval (D : Duration) return struct_timeval; + pragma Inline (To_Timeval); + + function gettimeofday + (tv : access struct_timeval; + tz : access struct_timezone) return int; + pragma Import (C, gettimeofday, "gettimeofday"); + + procedure usleep (useconds : unsigned_long); + pragma Import (C, usleep, "usleep"); + + -- add a hook to locate the Epoch, for use with Calendar???? + + ------------------------- + -- Priority Scheduling -- + ------------------------- + + MIN_PRIO : constant := 0; + MAX_PRIO : constant := 126; + + SCHED_RR : constant := 0; + SCHED_IO : constant := 1; + SCHED_FIFO : constant := 2; + SCHED_OTHER : constant := 3; + + ------------- + -- Process -- + ------------- + + type pid_t is private; + + function kill + (pid : pid_t; + sig : Signal) + return int; + pragma Import (C, kill, "kill"); + + function getpid return pid_t; + pragma Import (C, getpid, "getpid"); + + ------------- + -- Threads -- + ------------- + + type Thread_Body is access + function (arg : System.Address) return System.Address; + + + type pthread_t is private; + type pthread_mutex_t is limited private; + type pthread_cond_t is limited private; + type pthread_attr_t is limited private; + type pthread_mutexattr_t is limited private; + type pthread_condattr_t is limited private; + type pthread_key_t is private; + + PTHREAD_CREATE_DETACHED : constant := 1; + PTHREAD_CREATE_JOINABLE : constant := 0; + + --------------------------- + -- POSIX.1c Section 3 -- + --------------------------- + + function sigwait + (set : access sigset_t; + sig : access Signal) + return int; + pragma Import (C, sigwait, "sigwait"); + + function pthread_kill + (thread : pthread_t; + sig : Signal) + return int; + pragma Import (C, pthread_kill, "pthread_kill"); + + function pthread_sigmask + (how : int; + set : access sigset_t; + oset : access sigset_t) + return int; + pragma Import (C, pthread_sigmask, "pthread_sigmask"); + + ---------------------------- + -- POSIX.1c Section 11 -- + ---------------------------- + + function pthread_mutexattr_init + (attr : access pthread_mutexattr_t) + return int; + pragma Import (C, pthread_mutexattr_init, "pthread_mutexattr_init"); + + function pthread_mutexattr_destroy + (attr : access pthread_mutexattr_t) + return int; + pragma Import (C, pthread_mutexattr_destroy, "pthread_mutexattr_destroy"); + + function pthread_mutex_init + (mutex : access pthread_mutex_t; + attr : access pthread_mutexattr_t) + return int; + pragma Import (C, pthread_mutex_init, "pthread_mutex_init"); + + function pthread_mutex_destroy + (mutex : access pthread_mutex_t) + return int; + pragma Import (C, pthread_mutex_destroy, "pthread_mutex_destroy"); + + function pthread_mutex_lock + (mutex : access pthread_mutex_t) + return int; + pragma Import (C, pthread_mutex_lock, "pthread_mutex_lock"); + + function pthread_mutex_unlock + (mutex : access pthread_mutex_t) + return int; + pragma Import (C, pthread_mutex_unlock, "pthread_mutex_unlock"); + + function pthread_condattr_init + (attr : access pthread_condattr_t) + return int; + pragma Import (C, pthread_condattr_init, "pthread_condattr_init"); + + function pthread_condattr_destroy + (attr : access pthread_condattr_t) + return int; + pragma Import (C, pthread_condattr_destroy, "pthread_condattr_destroy"); + + function pthread_cond_init + (cond : access pthread_cond_t; + attr : access pthread_condattr_t) + return int; + pragma Import (C, pthread_cond_init, "pthread_cond_init"); + + function pthread_cond_destroy + (cond : access pthread_cond_t) + return int; + pragma Import (C, pthread_cond_destroy, "pthread_cond_destroy"); + + function pthread_cond_signal + (cond : access pthread_cond_t) + return int; + pragma Import (C, pthread_cond_signal, "pthread_cond_signal"); + + function pthread_cond_wait + (cond : access pthread_cond_t; + mutex : access pthread_mutex_t) + return int; + pragma Import (C, pthread_cond_wait, "pthread_cond_wait"); + + function pthread_cond_timedwait + (cond : access pthread_cond_t; + mutex : access pthread_mutex_t; + abstime : access timespec) + return int; + pragma Import (C, pthread_cond_timedwait, "pthread_cond_timedwait"); + + ---------------------------- + -- POSIX.1c Section 13 -- + ---------------------------- + + -- FreeBSD pthreads does not support these yet. +-- PTHREAD_PRIO_NONE : constant := 0; +-- PTHREAD_PRIO_PROTECT : constant := 2; +-- PTHREAD_PRIO_INHERIT : constant := 1; + + -- FreeBSD doesn't have pthread_getschedparam or pthread_setschedparam + -- yet. It has pthread_getprio and pthread_setprio, so we use these + -- instead. + +-- type struct_sched_param is record +-- prio : int; +-- no_data : System.Address; +-- end record; +-- pragma Convention (C, struct_sched_param); +-- +-- function pthread_getschedparam +-- (thread : pthread_t; +-- policy : access int; +-- param : access struct_sched_param) +-- return int; +-- pragma Import (C, pthread_getschedparam, "pthread_getschedparam"); +-- +-- function pthread_setschedparam +-- (thread : pthread_t; +-- policy : int; +-- param : access struct_sched_param) +-- return int; +-- pragma Import (C, pthread_setschedparam, "pthread_setschedparam"); + + function pthread_getschedparam + (thread : pthread_t) + return int; + pragma Import (C, pthread_getschedparam, "pthread_getprio"); + + function pthread_setschedparam + (thread : pthread_t; + priority : int) + return int; + pragma Import (C, pthread_setschedparam, "pthread_setprio"); + + function pthread_attr_setscope + (attr : access pthread_attr_t; + contentionscope : int) + return int; + pragma Import (C, pthread_attr_setscope, "pthread_attr_setscope"); + + function pthread_attr_getscope + (attr : access pthread_attr_t; + contentionscope : access int) + return int; + pragma Import (C, pthread_attr_getscope, "pthread_attr_getscope"); + + function pthread_attr_setinheritsched + (attr : access pthread_attr_t; + inheritsched : int) + return int; + pragma Import + (C, pthread_attr_setinheritsched, "pthread_attr_setinheritsched"); + + function pthread_attr_getinheritsched + (attr : access pthread_attr_t; + inheritsched : access int) + return int; + pragma Import + (C, pthread_attr_getinheritsched, "pthread_attr_getinheritsched"); + + function pthread_attr_setschedpolicy + (attr : access pthread_attr_t; + policy : int) + return int; + pragma Import + (C, pthread_attr_setschedpolicy, + "pthread_attr_setschedpolicy"); + + function pthread_attr_getschedpolicy + (attr : access pthread_attr_t; + policy : access int) + return int; + pragma Import (C, pthread_attr_getschedpolicy, + "pthread_attr_getschedpolicy"); + + -- FreeBSD doesn't have pthread_attr_setschedparm and + -- pthread_attr_getschedparm yet. It has pthread_attr_setprio and + -- pthread_attr_getprio instead. It seems we don't need either one + -- of these, though. + +-- function pthread_attr_setschedparam +-- (attr : access pthread_attr_t; +-- sched_param : access struct_sched_param) +-- return int; +-- pragma Import (C, pthread_attr_setschedparam, +-- "pthread_attr_setschedparam"); +-- +-- function pthread_attr_getschedparam +-- (attr : access pthread_attr_t; +-- sched_param : access struct_sched_param) +-- return int; +-- pragma Import (C, pthread_attr_getschedparam, +-- "pthread_attr_getschedparam"); + function pthread_attr_setschedparam + (attr : access pthread_attr_t; + priority : int) + return int; + pragma Import (C, pthread_attr_setschedparam, "pthread_attr_setprio"); + + function pthread_attr_getschedparam + (attr : access pthread_attr_t) + return int; + pragma Import (C, pthread_attr_getschedparam, "pthread_attr_getprio"); + + function sched_yield return int; + pragma Import (C, sched_yield, "pthread_yield"); + + ----------------------------- + -- P1003.1c - Section 16 -- + ----------------------------- + + function pthread_attr_init + (attributes : access pthread_attr_t) + return int; + pragma Import (C, pthread_attr_init, "pthread_attr_init"); + + function pthread_attr_destroy + (attributes : access pthread_attr_t) + return int; + pragma Import (C, pthread_attr_destroy, "pthread_attr_destroy"); + + + + function pthread_attr_setdetachstate + (attr : access pthread_attr_t; + detachstate : int) + return int; + pragma Import + (C, pthread_attr_setdetachstate, "pthread_attr_setdetachstate"); + + function pthread_attr_getdetachstate + (attr : access pthread_attr_t; + detachstate : access int) + return int; + pragma Import + (C, pthread_attr_getdetachstate, "pthread_attr_getdetachstate"); + + function pthread_attr_getstacksize + (attr : access pthread_attr_t; + stacksize : access size_t) + return int; + pragma Import + (C, pthread_attr_getstacksize, "pthread_attr_getstacksize"); + + function pthread_attr_setstacksize + (attr : access pthread_attr_t; + stacksize : size_t) + return int; + pragma Import + (C, pthread_attr_setstacksize, "pthread_attr_setstacksize"); + + function pthread_create + (thread : access pthread_t; + attributes : access pthread_attr_t; + start_routine : Thread_Body; + arg : System.Address) + return int; + pragma Import (C, pthread_create, "pthread_create"); + + function pthread_detach (thread : pthread_t) return int; + pragma Import (C, pthread_detach, "pthread_detach"); + + procedure pthread_exit (status : System.Address); + pragma Import (C, pthread_exit, "pthread_exit"); + + function pthread_self return pthread_t; + pragma Import (C, pthread_self, "pthread_self"); + + function pthread_equal (t1 : pthread_t; t2 : pthread_t) + return int; + -- be careful not to use "=" on thread_t! + pragma Import (C, pthread_equal, "pthread_equal"); + + ---------------------------- + -- POSIX.1c Section 17 -- + ---------------------------- + + function pthread_setspecific + (key : pthread_key_t; + value : System.Address) + return int; + pragma Import (C, pthread_setspecific, "pthread_setspecific"); + + function pthread_getspecific (key : pthread_key_t) return System.Address; + pragma Import (C, pthread_getspecific, "pthread_getspecific"); + + + type destructor_pointer is access + procedure (arg : System.Address); + + function pthread_key_create + (key : access pthread_key_t; + destructor : destructor_pointer) + return int; + pragma Import (C, pthread_key_create, "pthread_key_create"); + + +private + + type sigset_t is new unsigned_long; + + -- Should we add a signal_context type here ? + -- How could it be done independent of the CPU architecture ? + -- sigcontext type is opaque, so it is architecturally neutral. + -- It is always passed as an access type, so define it as an empty record + -- since the contents are not used anywhere. + type struct_sigcontext is null record; + pragma Convention (C, struct_sigcontext); + + -- In Solaris 2.4 the component sa_handler turns out to + -- be one a union type, and the selector is a macro: + -- #define sa_handler __funcptr._handler + -- #define sa_sigaction __funcptr._sigaction + + type pid_t is new int; + + type time_t is new long; + + type timespec is record + ts_sec : time_t; + ts_nsec : long; + end record; + pragma Convention (C, timespec); + + type struct_timeval is record + tv_sec : long; + tv_usec : long; + end record; + pragma Convention (C, struct_timeval); + + + type enumeral_type_3 is new int; + type pthread_attr_t is record + schedparam_policy : enumeral_type_3; + prio : int; + suspend : int; + flags : int; + arg_attr : System.Address; + cleanup_attr : System.Address; + stackaddr_attr : System.Address; + stacksize_attr : size_t; + end record; + pragma Convention (C, pthread_attr_t); + + type enumeral_type_2 is new int; + type pthread_condattr_t is record + c_type : enumeral_type_2; + c_flags : long; + end record; + pragma Convention (C, pthread_condattr_t); + + type enumeral_type_1 is new int; + type pthread_mutexattr_t is record + m_type : enumeral_type_1; + m_flags : long; + end record; + pragma Convention (C, pthread_mutexattr_t); + + type record_type_3 is null record; + pragma Convention (C, record_type_3); + type pthread_t is access record_type_3; + + type enumeral_type_4 is new int; + type pthread_queue_t is record + q_next : System.Address; + q_last : System.Address; + q_data : System.Address; + end record; + pragma Convention (C, pthread_queue_t); + type union_type_1 is new int; + type pthread_mutex_t is record + m_type : enumeral_type_4; + m_queue : pthread_queue_t; + m_owner : System.Address; +-- m_lock : long; + m_data : union_type_1; + m_flags : long; + end record; + pragma Convention (C, pthread_mutex_t); + + type enumeral_type_5 is new int; + type pthread_cond_t is record + c_type : enumeral_type_5; + c_queue : pthread_queue_t; +-- c_lock : long; + c_data : System.Address; + c_flags : long; + end record; + pragma Convention (C, pthread_cond_t); + + type pthread_key_t is new int; + +end System.OS_Interface; diff --git a/lang/gnat/files/5ftaprop.adb b/lang/gnat/files/5ftaprop.adb new file mode 100644 index 000000000000..33d96dd5d81d --- /dev/null +++ b/lang/gnat/files/5ftaprop.adb @@ -0,0 +1,779 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- S Y S T E M . T A S K _ P R I M I T I V E S . O P E R A T I O N S -- +-- -- +-- B o d y -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.4 $ -- +-- -- +-- Copyright (C) 1991,1992,1993,1994,1995,1996 Florida State University -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD PTHREADS version of this package. Contributed +-- by Daniel M. Eischen (deischen@iworks.InterWorks.org). + +with Interfaces.C; +-- used for int +-- size_t + +with System.Error_Reporting; +-- used for Shutdown + +with System.Interrupt_Management; +-- used for Keep_Unmasked +-- Abort_Task_Interrupt +-- Interrupt_ID + +with System.OS_Interface; +-- used for various type, constant, and operations + +with System.Parameters; +-- used for Size_Type + +with System.Storage_Elements; +-- used for To_Address +-- Integer_Address + +with System.Tasking; +-- used for Ada_Task_Control_Block +-- Task_ID + +with System.Time_Operations; +-- used for Clock +-- Clock_Delay_Correction + +with Unchecked_Conversion; +with Unchecked_Deallocation; + +package body System.Task_Primitives.Operations is + + use System.Tasking; + use Interfaces.C; + use System.Error_Reporting; + use System.OS_Interface; + use System.Parameters; + use System.Time_Operations; + + pragma Linker_Options ("-lc_r"); + + ------------------ + -- Local Data -- + ------------------ + + -- The followings are logically constants, but need to be initialized + -- at run time. + + ATCB_Key : aliased pthread_key_t; + -- Key used to find the Ada Task_ID associated with a thread + + All_Signal_Mask, + -- The set of all signals + + Unblocked_Signal_Mask : aliased sigset_t; + -- The set of signals that should unblocked in all tasks + + ----------------------- + -- Local Subprograms -- + ----------------------- + + procedure Abort_Handler + (signo : Signal; + code : Interfaces.C.int; + context : access struct_sigcontext); + + function To_Task_ID is new Unchecked_Conversion (System.Address, Task_ID); + + function To_Address is new Unchecked_Conversion (Task_ID, System.Address); + + ------------------- + -- Abort_Handler -- + ------------------- + + -- Target-dependent binding of inter-thread Abort signal to + -- the raising of the Abort_Signal exception. + + -- The technical issues and alternatives here are essentially + -- the same as for raising exceptions in response to other + -- signals (e.g. Storage_Error). See code and comments in + -- the package body System.Interrupt_Management. + + -- Some implementations may not allow an exception to be propagated + -- out of a handler, and others might leave the signal or + -- interrupt that invoked this handler masked after the exceptional + -- return to the application code. + + -- GNAT exceptions are originally implemented using setjmp()/longjmp(). + -- On most UNIX systems, this will allow transfer out of a signal handler, + -- which is usually the only mechanism available for implementing + -- asynchronous handlers of this kind. However, some + -- systems do not restore the signal mask on longjmp(), leaving the + -- abort signal masked. + + -- Alternative solutions include: + + -- 1. Change the PC saved in the system-dependent Context + -- parameter to point to code that raises the exception. + -- Normal return from this handler will then raise + -- the exception after the mask and other system state has + -- been restored (see example below). + -- 2. Use siglongjmp()/sigsetjmp() to implement exceptions. + -- 3. Unmask the signal in the Abortion_Signal exception handler + -- (in the RTS). + + -- The following procedure would be needed if we can't lonjmp out of + -- a signal handler. (See below.) + -- procedure Raise_Abort_Signal is + -- begin + -- raise Standard'Abort_Signal; + -- end if; + + procedure Abort_Handler + (signo : Signal; + code : Interfaces.C.int; + context : access struct_sigcontext) is + + T : Task_ID := Self; + + begin + -- Assuming it is safe to longjmp out of a signal handler, the + -- following code can be used: + + if T.Deferral_Level = 0 + and then T.Pending_ATC_Level < T.ATC_Nesting_Level then + raise Standard'Abort_Signal; + end if; + + -- Otherwise, something like this is required: + -- if not Abort_Is_Deferred.all then + -- -- Overwrite the return PC address with the address of the + -- -- special raise routine, and "return" to that routine's + -- -- starting address. + -- Context.PC := Raise_Abort_Signal'Address; + -- return; + -- end if; + + end Abort_Handler; + + ---------- + -- Self -- + ---------- + + function Self return Task_ID is + Result : System.Address; + + begin + Result := pthread_getspecific (ATCB_Key); + pragma Assert (Result /= System.Null_Address + or else Shutdown ("GNULLI failure---pthread_getspecific")); + return To_Task_ID (Result); + end Self; + + --------------------- + -- Initialize_Lock -- + --------------------- + + -- Note: mutexes and cond_variables needed per-task basis are + -- initialized in Intialize_TCB and the Storage_Error is + -- handled. Other mutexes (such as All_Tasks_Lock, Memory_Lock...) + -- used in RTS is initialized before any status change of RTS. + -- Therefore rasing Storage_Error in the following routines + -- should be able to be handled safely. + + procedure Initialize_Lock + (Prio : System.Any_Priority; + L : access Lock) + is + Attributes : aliased pthread_mutexattr_t; + Result : Interfaces.C.int; + begin + Result := pthread_mutexattr_init (Attributes'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutexattr_init")); + + if Result = ENOMEM then + raise STORAGE_ERROR; + end if; + + Result := pthread_mutex_init (L, Attributes'Access); + + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutex_init")); + + if Result = ENOMEM then + raise STORAGE_ERROR; + end if; + + end Initialize_Lock; + + procedure Initialize_Lock (L : access RTS_Lock) is + Attributes : aliased pthread_mutexattr_t; + Result : Interfaces.C.int; + + begin + Result := pthread_mutexattr_init (Attributes'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutexattr_init")); + + if Result = ENOMEM then + raise STORAGE_ERROR; + end if; + + Result := pthread_mutex_init (L, Attributes'Access); + + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutex_init")); + + if Result = ENOMEM then + raise STORAGE_ERROR; + end if; + + end Initialize_Lock; + + ------------------- + -- Finalize_Lock -- + ------------------- + + procedure Finalize_Lock (L : access Lock) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_destroy (L); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_destroy")); + end Finalize_Lock; + + procedure Finalize_Lock (L : access RTS_Lock) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_destroy (L); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_destroy")); + end Finalize_Lock; + + ---------------- + -- Write_Lock -- + ---------------- + + procedure Write_Lock (L : access Lock; Ceiling_Violation : out Boolean) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_lock (L); + Ceiling_Violation := Result = EINVAL; + -- assumes the cause of EINVAL is a priority ceiling violation + pragma Assert (Result = 0 or else Result = EINVAL + or else Shutdown ("GNULLI failure---pthread_mutex_lock")); + end Write_Lock; + + procedure Write_Lock (L : access RTS_Lock) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_lock (L); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_lock")); + end Write_Lock; + + procedure Write_Lock (T : Task_ID) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_lock (T.LL.L'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_lock")); + end Write_Lock; + + --------------- + -- Read_Lock -- + --------------- + + procedure Read_Lock (L : access Lock; Ceiling_Violation : out Boolean) is + begin + Write_Lock (L, Ceiling_Violation); + end Read_Lock; + + ------------ + -- Unlock -- + ------------ + + procedure Unlock (L : access Lock) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_unlock (L); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_unlock")); + end Unlock; + + procedure Unlock (L : access RTS_Lock) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_unlock (L); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_unlock")); + end Unlock; + + procedure Unlock (T : Task_ID) is + Result : Interfaces.C.int; + + begin + Result := pthread_mutex_unlock (T.LL.L'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_unlock")); + end Unlock; + + ------------- + -- Sleep -- + ------------- + + procedure Sleep (Self_ID : Task_ID) is + Result : Interfaces.C.int; + + begin + pragma Assert (Self_ID = Self + or else Shutdown ("GNULLI failure---Self in Sleep")); + Result := pthread_cond_wait (Self_ID.LL.CV'Access, Self_ID.LL.L'Access); + -- EINTR is not considered a failure. + pragma Assert (Result = 0 or else Result = EINTR + or else Shutdown ("GNULLI failure---Sleep")); + end Sleep; + + --------------- + -- Sleep_For -- + --------------- + + procedure Sleep_For (Self_ID : Task_ID; Rel_Time : Duration) is + Result : Interfaces.C.Int; + Request : aliased timespec; + + begin + pragma Assert (Self_ID = Self + or else Shutdown ("GNULLI failure---Self in Sleep_For")); + Request := To_Timespec (Rel_Time + Clock + Clock_Delay_Correction); + Result := pthread_cond_timedwait + (Self_ID.LL.CV'Access, Self_ID.LL.L'Access, Request'Access); + pragma Assert + (Result = 0 + or else (Clock >= To_Duration (Request) - Clock_Delay_Correction) + or else Shutdown ("GNULLI failure---Sleep_For")); + end Sleep_For; + + ----------------- + -- Sleep_Until -- + ----------------- + + procedure Sleep_Until (Self_ID : Task_ID; Abs_Time : Duration) is + Result : Interfaces.C.Int; + Request : aliased timespec; + + begin + pragma Assert (Self_ID = Self + or else Shutdown ("GNULLI failure---Self in Sleep_Until")); + Request := To_Timespec (Abs_Time + Clock_Delay_Correction); + Result := pthread_cond_timedwait + (Self_ID.LL.CV'Access, Self_ID.LL.L'Access, Request'Access); + pragma Assert + (Result = 0 or else Clock >= Abs_Time + or else Shutdown ("GNULLI failure---Sleep_Until (early)")); + end Sleep_Until; + + ------------ + -- Wakeup -- + ------------ + + procedure Wakeup (T : Task_ID) is + Result : Interfaces.C.int; + + begin + Result := pthread_cond_signal (T.LL.CV'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Wakeup")); + end Wakeup; + + ----------- + -- Yield -- + ----------- + + procedure Yield is + Result : Interfaces.C.int; + begin + Result := sched_yield; + end Yield; + + ------------------ + -- Set_Priority -- + ------------------ + + -- FreeBSD doesn't have the correct pthread_setschedparam routine + -- yet. Instead, pthread_setschedparam is imported from pthread_setprio + -- which only takes a pthread_t and integer as arguments. +-- procedure Set_Priority (T : Task_ID; Prio : System.Any_Priority) is +-- Result : Interfaces.C.int; +-- Param : aliased struct_sched_param; +-- begin +-- T.LL.Current_Priority := Interfaces.C.int (Prio); +-- Param.prio := Interfaces.C.int (Prio); +-- +-- Result := pthread_setschedparam (T.LL.Thread, SCHED_FIFO, +-- Param'Access); +-- pragma Assert (Result = 0 +-- or else Shutdown ("GNULLI failure---Set_Priority")); +-- +-- end Set_Priority; + procedure Set_Priority (T : Task_ID; Prio : System.Any_Priority) is + Result : Interfaces.C.int; + begin + T.LL.Current_Priority := Interfaces.C.int (Prio); + + Result := pthread_setschedparam (T.LL.Thread, Interfaces.C.int (Prio)); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Set_Priority")); + + end Set_Priority; + + ------------------ + -- Get_Priority -- + ------------------ + + function Get_Priority (T : Task_ID) return System.Any_Priority is + begin + return System.Any_Priority (T.LL.Current_Priority); + end Get_Priority; + + ---------------- + -- Enter_Task -- + ---------------- + + procedure Enter_Task (Self_ID : Task_ID) is + Result : Interfaces.C.int; + Old_Set : aliased sigset_t; + + begin + + Self_ID.LL.Thread := pthread_self; + + -- It is not safe for the new task accept signals until it + -- has bound its TCB pointer to the thread with pthread_setspecific (), + -- since the handler wrappers use the TCB pointer + -- to restore the stack limit. + + Result := pthread_setspecific (ATCB_Key, To_Address (Self_ID)); + pragma Assert (Result = 0 or else + Shutdown ("GNULLI failure---Enter_Task (pthread_setspecific)")); + + -- Must wait until the above operation is done to unmask signals, + -- since signal handler for abort will try to access the ATCB to + -- check whether abort is deferred, and exception propagation will + -- try to use task-specific data as mentioned above. + + Result := pthread_sigmask + (SIG_UNBLOCK, Unblocked_Signal_Mask'Access, Old_Set'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Enter_Task (pthread_sigmask)")); + + end Enter_Task; + + ---------------------- + -- Initialize_TCB -- + ---------------------- + + procedure Initialize_TCB (Self_ID : Task_ID; Succeeded : out Boolean) is + Mutex_Attr : aliased pthread_mutexattr_t; + Result : Interfaces.C.int; + Cond_Attr : aliased pthread_condattr_t; + + begin + Result := pthread_mutexattr_init (Mutex_Attr'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutexattr_init")); + + if Result /= 0 then + Succeeded := False; + return; + end if; + + Result := pthread_mutex_init (Self_ID.LL.L'Access, Mutex_Attr'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_mutex_init")); + + if Result /= 0 then + Succeeded := False; + return; + end if; + + Result := pthread_condattr_init (Cond_Attr'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_condattr_init")); + + if Result /= 0 then + Result := pthread_mutex_destroy (Self_ID.LL.L'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_destory")); + Succeeded := False; + return; + end if; + + Result := pthread_cond_init (Self_ID.LL.CV'Access, Cond_Attr'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_cond_init")); + + if Result /= 0 then + Result := pthread_mutex_destroy (Self_ID.LL.L'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_mutex_destory")); + Succeeded := False; + return; + end if; + + Succeeded := True; + + end Initialize_TCB; + + ----------------- + -- Create_Task -- + ----------------- + + procedure Create_Task + (T : Task_ID; + Wrapper : System.Address; + Stack_Size : System.Parameters.Size_Type; + Priority : System.Any_Priority; + Succeeded : out Boolean) + is + Attributes : aliased pthread_attr_t; + Adjusted_Stack_Size : Interfaces.C.size_t; + Result : Interfaces.C.int; + Old_Set : aliased sigset_t; + + function Thread_Body_Access is new + Unchecked_Conversion (System.Address, Thread_Body); + + begin + if Stack_Size = System.Parameters.Unspecified_Size then + Adjusted_Stack_Size := Interfaces.C.size_t (2 * Default_Stack_Size); + -- Let's change the s-parame.adb to give a larger Stack_Size ????? + else + if Stack_Size < Size_Type (Minimum_Stack_Size) then + Adjusted_Stack_Size := + Interfaces.C.size_t (Stack_Size + Minimum_Stack_Size); + + -- sum, instead of max: may be overkill, but should be safe + -- thr_min_stack is a function call. + + -- Actually, we want to get the Default_Stack_Size and + -- Minimum_Stack_Size from the file System.Parameters. + -- Right now the package is not made target specific. + -- We use our own local definitions for now ??? + + else + Adjusted_Stack_Size := Interfaces.C.size_t (Stack_Size); + end if; + + -- Ask for 4 extra bytes of stack space so that the ATCB + -- pointer can be stored below the stack limit, plus extra + -- space for the frame of Task_Wrapper. This is so the user + -- gets the amount of stack requested exclusive of the needs + -- of the runtime. + + end if; + + Adjusted_Stack_Size := Adjusted_Stack_Size + 4; + + -- Since the initial signal mask of a thread is inherited from the + -- creator, we need to set our local signal mask mask all signals + -- during the creation operation, to make sure the new thread is + -- not disturbed by signals before it has set its own Task_ID. + + Result := pthread_attr_init (Attributes'Access); + pragma Assert (Result = 0 or else Result = ENOMEM + or else Shutdown ("GNULLI failure---pthread_attr_init")); + + if Result /= 0 then + Succeeded := False; + return; + end if; + + -- Create threads detached following email to report@gnat.com + -- confirming this is correct (should be fixed for GNAT after 3.09). + -- (Peter Burwood) + Result := pthread_attr_setdetachstate + (Attributes'Access, PTHREAD_CREATE_DETACHED); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_setdetachstate")); + + Result := pthread_attr_setstacksize + (Attributes'Access, Interfaces.C.size_t (Adjusted_Stack_Size)); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---pthread_attr_setstacksize")); + + Result := pthread_sigmask + (SIG_SETMASK, All_Signal_Mask'Access, Old_Set'Access); + pragma Assert (Result = 0 or else + Shutdown ("GNULLI failure---Create_Task (pthread_sigmask)")); + + Result := pthread_create + (T.LL.Thread'Access, + Attributes'Access, + Thread_Body_Access (Wrapper), + To_Address (T)); + pragma Assert (Result = 0 or else Result = EAGAIN + or else Shutdown ("GNULLI failure---Create_Task (pthread_create)")); + + Succeeded := Result = 0; + + Result := pthread_sigmask + (SIG_SETMASK, Old_Set'Unchecked_Access, null); + pragma Assert (Result = 0 or else + Shutdown ("GNULLI failure---Create_Task (pthread_sigmask)")); + + Set_Priority (T, Priority); + + end Create_Task; + + ------------------ + -- Finalize_TCB -- + ------------------ + + procedure Finalize_TCB (T : Task_ID) is + Result : Interfaces.C.int; + Tmp : Task_ID := T; + + procedure Free is new Unchecked_Deallocation + (Ada_Task_Control_Block, Task_ID); + + begin + Result := pthread_mutex_destroy (T.LL.L'Access); + pragma Assert (Result = 0 or else + Shutdown ("GNULLI failure---Finalize_TCB (pthread_mutex_destroy)")); + Result := pthread_cond_destroy (T.LL.CV'Access); + pragma Assert (Result = 0 or else + Shutdown ("GNULLI failure---Finalize_TCB (pthread_cond_destroy)")); + + -- Following report to report@gnat.com regarding ATCB memory leak + -- this Free is now called. The answer back from ACT didn't give + -- the source for a fix, but I calling this Free is sufficient. + -- (Peter Burwood) + Free (Tmp); + end Finalize_TCB; + + --------------- + -- Exit_Task -- + --------------- + + procedure Exit_Task is + begin + pthread_exit (System.Null_Address); + end Exit_Task; + + ---------------- + -- Abort_Task -- + ---------------- + + procedure Abort_Task (T : Task_ID) is + Result : Interfaces.C.int; + + begin + Result := pthread_kill (T.LL.Thread, + Signal (System.Interrupt_Management.Abort_Task_Interrupt)); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Abort_Task")); + end Abort_Task; + + ---------------- + -- Initialize -- + ---------------- + + procedure Initialize (Environment_Task : Task_ID) is + act : aliased struct_sigaction; + old_act : aliased struct_sigaction; + Tmp_Set : aliased sigset_t; + Result : Interfaces.C.int; + + begin + + Enter_Task (Environment_Task); + + -- Install the abort-signal handler + + act.sa_flags := 0; + act.sa_handler := Abort_Handler'Address; + + Result := sigemptyset (Tmp_Set'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (sigemptyset)")); + act.sa_mask := Tmp_Set; + + Result := + sigaction ( + Signal (System.Interrupt_Management.Abort_Task_Interrupt), + act'Access, + old_act'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (sigaction)")); + + end Initialize; + +begin + declare + Result : Interfaces.C.int; + begin + + -- pthread_init; + -- This call is needed for MIT thread library. We wish + -- we could move this to s-osinte.adb and be executed during + -- the package elaboration. However, in doing so we get an + -- elaboration problem. + + -- It doesn't appear necessary to call it because pthread_init is + -- called before any Ada elaboration occurs. + + Result := sigfillset (All_Signal_Mask'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (sigfillset)")); + + Result := sigemptyset (Unblocked_Signal_Mask'Access); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (sigemptyset)")); + + for J in Interrupt_Management.Interrupt_ID loop + if System.Interrupt_Management.Keep_Unmasked (J) then + Result := sigaddset (Unblocked_Signal_Mask'Access, Signal (J)); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (sigaddset)")); + end if; + end loop; + + Result := pthread_key_create (ATCB_Key'Access, null); + pragma Assert (Result = 0 + or else Shutdown ("GNULLI failure---Initialize (pthread_keycreate)")); + end; + +end System.Task_Primitives.Operations; diff --git a/lang/gnat/files/5ftaspri.ads b/lang/gnat/files/5ftaspri.ads new file mode 100644 index 000000000000..9cd6b64d989b --- /dev/null +++ b/lang/gnat/files/5ftaspri.ads @@ -0,0 +1,138 @@ +------------------------------------------------------------------------------ +-- -- +-- GNU ADA RUNTIME LIBRARY (GNARL) COMPONENTS -- +-- -- +-- S Y S T E M . T A S K _ P R I M I T I V E S -- +-- -- +-- S p e c -- +-- (Version for new GNARL) -- +-- -- +-- $Revision: 1.1 $ -- +-- -- +-- Copyright (C) 1991,92,93,94,95,1996 Free Software Foundation, Inc. -- +-- -- +-- GNARL 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 2, or (at your option) any later ver- -- +-- sion. GNARL 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. 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. -- +-- -- +-- GNARL was developed by the GNARL team at Florida State University. It is -- +-- now maintained by Ada Core Technologies Inc. in cooperation with Florida -- +-- State University (http://www.gnat.com). -- +-- -- +------------------------------------------------------------------------------ + +-- This is the FreeBSD PTHREADS version of this package. Contributed +-- by Daniel M. Eischen (deischen@iworks.InterWorks.org). + +-- DO NOT EDIT this file. +-- It was automatically generated from another file by the m4 macro processor. +-- The name of the file you should edit is the same as this one, but with +-- ".ads" replaced by ".sm4", or +-- ".adb" replaced by ".bm4", or +-- ".c" replaced by ".cm4", or +-- ".dat" replaced by ".tm4" + +-- Local options selected: +-- __TARGET = i386-unknown-freebsd +-- __ARCH = I386 +-- __OS = FREEBSD +-- __HAS_SIGCONTEXT = 1 +-- __HAS_UCONTEXT = 0 +-- __THREADS = POSIX_THREADS +-- __THREAD_VARIANT = ?? +-- __HAS_TIMESPEC = 1 +-- __HAS_NANOSLEEP = 1 +-- __HAS_CLOCK_GETTIME = 0 +-- __HAS_GETTIMEOFDAY = 1 +-- __POSIX_THREAD_PRIO_PROTECT = 0 +-- __POSIX_THREAD_PRIO_INHERIT = 0 +-- __POSIX_THREAD_ATTR_STACKADDR = 1 +-- __POSIX_THREAD_ATTR_STACKSIZE = 1 +-- __POSIX_THREAD_PRIORITY_SCHEDULING = 0 + +-- This package provides low-level support for most tasking features. + +with Interfaces.C; +-- used for int +-- size_t + +with System.OS_Interface; +-- used for pthread_mutex_t +-- pthread_cond_t +-- pthread_t + +package System.Task_Primitives is + + type Lock is limited private; + -- Should be used for implementation of protected objects. + + type RTS_Lock is limited private; + -- Should be used inside the runtime system. + -- The difference between Lock and the RTS_Lock is that the later + -- one serves only as a semaphore so that do not check for + -- ceiling violations. + + type Task_Body_Access is access procedure; + -- Pointer to the task body's entry point (or possibly a wrapper + -- declared local to the GNARL). + + type Private_Data is limited private; + -- Any information that the GNULLI needs maintained on a per-task + -- basis. A component of this type is guaranteed to be included + -- in the Ada_Task_Control_Block. + +private + + type Lock is new System.OS_Interface.pthread_mutex_t; + type RTS_Lock is new System.OS_Interface.pthread_mutex_t; + type Private_Data is record + Thread : aliased System.OS_Interface.pthread_t; + pragma Atomic (Thread); + -- Thread field may be updated by two different threads of control. + -- (See, Enter_Task and Create_Task in s-taprop.adb). + -- They put the same value (thr_self value). We do not want to + -- use lock on those operations and the only thing we have to + -- make sure is that they are updated in atomic fashion. + CV : aliased System.OS_Interface.pthread_cond_t; + L : aliased RTS_Lock; + -- protection for all components is lock L + Current_Priority : Interfaces.C.int := 0; + -- Active priority, except that the effects of protected object + -- priority ceilings are not reflected. This only reflects explicit + -- priority changes and priority inherited through task activation + -- and rendezvous. + -- Ada 95 notes: In Ada 95, this field will be transferred to the + -- Priority field of an Entry_Calls component when an entry call + -- is initiated. The Priority of the Entry_Calls component will not + -- change for the duration of the call. The accepting task can + -- use it to boost its own priority without fear of its changing in + -- the meantime. + -- This can safely be used in the priority ordering + -- of entry queues. Once a call is queued, its priority does not + -- change. + -- Since an entry call cannot be made while executing + -- a protected action, the priority of a task will never reflect a + -- priority ceiling change at the point of an entry call. + -- Protection: Only written by Self, and only accessed when Acceptor + -- accepts an entry or when Created activates, at which points Self is + -- suspended. + Stack_Size : Interfaces.c.size_t; + -- Requested stack size. + -- Protection: Only used by Self. + end record; + +end System.Task_Primitives; diff --git a/lang/gnat/files/patch-aa b/lang/gnat/files/patch-aa new file mode 100644 index 000000000000..eb8cd4588e4a --- /dev/null +++ b/lang/gnat/files/patch-aa @@ -0,0 +1,141 @@ +diff -c orig/Makefile.in gcc/Makefile.in +*** orig/Makefile.in Thu Mar 27 17:32:15 1997 +--- gcc-2.7.2.1/Makefile.in Fri Apr 4 19:55:09 1997 +*************** +*** 189,200 **** + local_prefix = /usr/local + # Directory in which to put host dependent programs and libraries + exec_prefix = $(prefix) + # Directory in which to put the executable for the command `gcc' + bindir = $(exec_prefix)/bin + # Directory in which to put the directories used by the compiler. + libdir = $(exec_prefix)/lib + # Directory in which the compiler finds executables, libraries, etc. +! libsubdir = $(libdir)/gcc-lib/$(target)/$(version) + # Directory in which the compiler finds g++ includes. + gxx_include_dir= $(libdir)/g++-include + # Directory to search for site-specific includes. +--- 189,202 ---- + local_prefix = /usr/local + # Directory in which to put host dependent programs and libraries + exec_prefix = $(prefix) ++ # directory to hold compilers ++ compdir = $(prefix)/libexec/ada + # Directory in which to put the executable for the command `gcc' + bindir = $(exec_prefix)/bin + # Directory in which to put the directories used by the compiler. + libdir = $(exec_prefix)/lib + # Directory in which the compiler finds executables, libraries, etc. +! libsubdir = $(libdir) + # Directory in which the compiler finds g++ includes. + gxx_include_dir= $(libdir)/g++-include + # Directory to search for site-specific includes. +*************** +*** 213,219 **** + mandir = $(prefix)/man/man1 + # Directory in which to find other cross-compilation tools and headers. + # Used in install-cross. +! tooldir = $(exec_prefix)/$(target) + # Dir for temp files. + tmpdir = /tmp + +--- 215,221 ---- + mandir = $(prefix)/man/man1 + # Directory in which to find other cross-compilation tools and headers. + # Used in install-cross. +! tooldir = $(exec_prefix) + # Dir for temp files. + tmpdir = /tmp + +*************** +*** 1141,1148 **** + + gcc.o: gcc.c $(CONFIG_H) multilib.h config.status $(lang_specs_files) + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ + -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \ +! -DSTANDARD_EXEC_PREFIX=\"$(libdir)/gcc-lib/\" \ + -DDEFAULT_TARGET_VERSION=\"$(version)\" \ + -DDEFAULT_TARGET_MACHINE=\"$(target)\" \ + -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\" \ +--- 1143,1152 ---- + + gcc.o: gcc.c $(CONFIG_H) multilib.h config.status $(lang_specs_files) + $(CC) $(ALL_CFLAGS) $(ALL_CPPFLAGS) $(INCLUDES) \ ++ -DFREEBSD_NATIVE \ ++ -DFREEBSD_PREFIX=\"$(prefix)\" \ + -DSTANDARD_STARTFILE_PREFIX=\"$(libdir)/\" \ +! -DSTANDARD_EXEC_PREFIX=\"$(libdir)/\" \ + -DDEFAULT_TARGET_VERSION=\"$(version)\" \ + -DDEFAULT_TARGET_MACHINE=\"$(target)\" \ + -DTOOLDIR_BASE_PREFIX=\"$(exec_prefix)/\" \ +*************** +*** 2055,2069 **** + # Create the installation directory. + install-dir: + -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; chmod a+rx $(libdir) ; fi +- -if [ -d $(libdir)/gcc-lib ] ; then true ; else mkdir $(libdir)/gcc-lib ; chmod a+rx $(libdir)/gcc-lib ; fi + # This dir isn't currently searched by cpp. + # -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; chmod a+rx $(libdir)/gcc-lib/include ; fi +! -if [ -d $(libdir)/gcc-lib/$(target) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target) ; chmod a+rx $(libdir)/gcc-lib/$(target) ; fi +! -if [ -d $(libdir)/gcc-lib/$(target)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version) ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version) ; fi +! -if [ -d $(libdir)/gcc-lib/$(target)/$(version)/include ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version)/include ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version)/include ; fi + -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; chmod a+rx $(bindir) ; fi + -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; chmod a+rx $(includedir) ; fi + -if [ -d $(tooldir) ] ; then true ; else mkdir $(tooldir) ; chmod a+rx $(tooldir) ; fi + -if [ -d $(assertdir) ] ; then true ; else mkdir $(assertdir) ; chmod a+rx $(assertdir) ; fi + -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; chmod a+rx $(infodir) ; fi + # We don't use mkdir -p to create the parents of mandir, +--- 2059,2073 ---- + # Create the installation directory. + install-dir: + -if [ -d $(libdir) ] ; then true ; else mkdir $(libdir) ; chmod a+rx $(libdir) ; fi + # This dir isn't currently searched by cpp. + # -if [ -d $(libdir)/gcc-lib/include ] ; then true ; else mkdir $(libdir)/gcc-lib/include ; chmod a+rx $(libdir)/gcc-lib/include ; fi +! # -if [ -d $(libdir)/gcc-lib/$(target) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target) ; chmod a+rx $(libdir)/gcc-lib/$(target) ; fi +! # -if [ -d $(libdir)/gcc-lib/$(target)/$(version) ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version) ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version) ; fi +! # -if [ -d $(libdir)/gcc-lib/$(target)/$(version)/include ] ; then true ; else mkdir $(libdir)/gcc-lib/$(target)/$(version)/include ; chmod a+rx $(libdir)/gcc-lib/$(target)/$(version)/include ; fi + -if [ -d $(bindir) ] ; then true ; else mkdir $(bindir) ; chmod a+rx $(bindir) ; fi + -if [ -d $(includedir) ] ; then true ; else mkdir $(includedir) ; chmod a+rx $(includedir) ; fi + -if [ -d $(tooldir) ] ; then true ; else mkdir $(tooldir) ; chmod a+rx $(tooldir) ; fi ++ -if [ -d $(compdir) ] ; then true ; else mkdir $(compdir) ; chmod a+rx $(compdir) ; fi + -if [ -d $(assertdir) ] ; then true ; else mkdir $(assertdir) ; chmod a+rx $(assertdir) ; fi + -if [ -d $(infodir) ] ; then true ; else mkdir $(infodir) ; chmod a+rx $(infodir) ; fi + # We don't use mkdir -p to create the parents of mandir, +*************** +*** 2077,2084 **** + install-common: native install-dir $(EXTRA_PARTS) lang.install-common + for file in $(COMPILERS); do \ + if [ -f $$file ] ; then \ +! rm -f $(libsubdir)/$$file; \ +! $(INSTALL_PROGRAM) $$file $(libsubdir)/$$file; \ + else true; \ + fi; \ + done +--- 2081,2088 ---- + install-common: native install-dir $(EXTRA_PARTS) lang.install-common + for file in $(COMPILERS); do \ + if [ -f $$file ] ; then \ +! rm -f $(compdir)/$$file; \ +! $(INSTALL_PROGRAM) $$file $(compdir)/$$file; \ + else true; \ + fi; \ + done +*************** +*** 2110,2117 **** + $(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \ + chmod a-x $(libsubdir)/SYSCALLS.c.X; \ + fi +! -rm -f $(libsubdir)/cpp$(exeext) +! $(INSTALL_PROGRAM) cpp$(exeext) $(libsubdir)/cpp$(exeext) + + # Install the driver program as $(target)-gcc + # and also as either gcc (if native) or $(tooldir)/bin/gcc. +--- 2114,2121 ---- + $(INSTALL_DATA) SYSCALLS.c.X $(libsubdir)/SYSCALLS.c.X; \ + chmod a-x $(libsubdir)/SYSCALLS.c.X; \ + fi +! -rm -f $(compdir)/cpp$(exeext) +! $(INSTALL_PROGRAM) cpp$(exeext) $(compdir)/cpp$(exeext) + + # Install the driver program as $(target)-gcc + # and also as either gcc (if native) or $(tooldir)/bin/gcc. diff --git a/lang/gnat/files/patch-ab b/lang/gnat/files/patch-ab new file mode 100644 index 000000000000..baf5ebdeec18 --- /dev/null +++ b/lang/gnat/files/patch-ab @@ -0,0 +1,36 @@ +diff -c orig/gcc.c gcc/gcc.c +*** orig/gcc.c Thu Apr 3 08:37:06 1997 +--- gcc-2.7.2.1/gcc.c Fri Apr 4 23:21:00 1997 +*************** +*** 1354,1362 **** + #undef MD_STARTFILE_PREFIX_1 + #endif + +! #ifndef STANDARD_EXEC_PREFIX +! #define STANDARD_EXEC_PREFIX "/usr/local/lib/gcc-lib/" +! #endif /* !defined STANDARD_EXEC_PREFIX */ + + static char *standard_exec_prefix = STANDARD_EXEC_PREFIX; + static char *standard_exec_prefix_1 = "/usr/lib/gcc/"; +--- 1354,1360 ---- + #undef MD_STARTFILE_PREFIX_1 + #endif + +! #define STANDARD_EXEC_PREFIX FREEBSD_PREFIX "/libexec/" + + static char *standard_exec_prefix = STANDARD_EXEC_PREFIX; + static char *standard_exec_prefix_1 = "/usr/lib/gcc/"; +*************** +*** 2708,2715 **** +--- 2706,2716 ---- + /* Use 2 as fourth arg meaning try just the machine as a suffix, + as well as trying the machine and the version. */ + #ifdef FREEBSD_NATIVE ++ add_prefix (&exec_prefixes, FREEBSD_PREFIX "/libexec/ada/", 0, 0, NULL_PTR); ++ add_prefix (&exec_prefixes, FREEBSD_PREFIX "/libexec/", 0, 0, NULL_PTR); + add_prefix (&exec_prefixes, "/usr/libexec/", 0, 0, NULL_PTR); + add_prefix (&exec_prefixes, "/usr/bin/", 0, 0, NULL_PTR); ++ add_prefix (&startfile_prefixes, FREEBSD_PREFIX "/lib/", 0, 0, NULL_PTR); + add_prefix (&startfile_prefixes, "/usr/libdata/gcc/", 0, 0, NULL_PTR); + #else /* not FREEBSD_NATIVE */ + #ifndef OS2 diff --git a/lang/gnat/files/patch-ac b/lang/gnat/files/patch-ac new file mode 100644 index 000000000000..e2e24ca4b439 --- /dev/null +++ b/lang/gnat/files/patch-ac @@ -0,0 +1,20 @@ +diff -c orig/ada/Makefile.in gcc/ada/Makefile.in +*** orig/ada/Makefile.in Thu Apr 3 12:40:23 1997 +--- gcc-2.7.2.1/ada/Makefile.in Thu Apr 3 12:41:49 1997 +*************** +*** 956,962 **** + $(srcdir)/../move-if-change tmp-ttypef.ads ttypef.ads + touch stamp-ttypef + +! ADA_INCLUDE_DIR = $(prefix)/adainclude + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib + + # Note: the strings below do not make sense for Ada strings in the OS/2 +--- 956,962 ---- + $(srcdir)/../move-if-change tmp-ttypef.ads ttypef.ads + touch stamp-ttypef + +! ADA_INCLUDE_DIR = $(prefix)/include/adainclude + ADA_RTL_OBJ_DIR = $(libsubdir)/adalib + + # Note: the strings below do not make sense for Ada strings in the OS/2 diff --git a/lang/gnat/files/patch-ad b/lang/gnat/files/patch-ad new file mode 100644 index 000000000000..b1a4ed1dd153 --- /dev/null +++ b/lang/gnat/files/patch-ad @@ -0,0 +1,46 @@ +diff -c orig/ada/Makefile.in gcc/ada/Makefile.in +*** orig/ada/Makefile.in Tue Jan 21 00:01:54 1997 +--- gcc-2.7.2.1/ada/Makefile.in Sat May 10 22:42:27 1997 +*************** +*** 189,193 **** + $(CC) -c $(ALL_ADAFLAGS) $< + .ads.o: +! $(CC) -c $(ALL_ADAFLAGS) $< + + # This tells GNU make version 3 not to export all the variables +--- 189,199 ---- + $(CC) -c $(ALL_ADAFLAGS) $< + .ads.o: +! @if [ -f $*.adb ]; then \ +! echo "$(CC) -c $(ALL_ADAFLAGS) $*.adb"; \ +! $(CC) -c $(ALL_ADAFLAGS) $*.adb; \ +! else \ +! echo "$(CC) -c $(ALL_ADAFLAGS) $*.ads"; \ +! $(CC) -c $(ALL_ADAFLAGS) $*.ads; \ +! fi + + # This tells GNU make version 3 not to export all the variables +*************** +*** 738,741 **** +--- 744,748 ---- + sparc-sun-sunos5*) letter=s ;;\ + *86*-linux*) letter=l ;;\ ++ *86*-freebsd*) letter=f ;;\ + mips-sgi-irix*) letter=g ;;\ + hppa*-hp-hpux*) letter=h ;;\ +*************** +*** 779,782 **** +--- 786,790 ---- + *-go32-msdos | *-go32 |\ + *86*-linux* |\ ++ *86*-freebsd* |\ + *) \ + \ +*************** +*** 845,848 **** +--- 853,857 ---- + *-go32-msdos | *-go32 |\ + *86*-linux* |\ ++ *86*-freebsd* |\ + *) \ + \ diff --git a/lang/gnat/files/patch-ae b/lang/gnat/files/patch-ae new file mode 100644 index 000000000000..85b50c157c15 --- /dev/null +++ b/lang/gnat/files/patch-ae @@ -0,0 +1,36 @@ +*** gcc/ada/make.adb.orig Thu Jun 5 08:37:34 1997 +--- gcc-2.7.2.1/ada/make.adb Thu Jun 5 11:30:57 1997 +*************** +*** 191,197 **** + -- Compiler, Binder & Linker Data and Subprograms -- + ---------------------------------------------------- + +! Gcc : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gcc"); + Gnatbind : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatbind"); + Gnatlink : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatlink"); + +--- 191,197 ---- + -- Compiler, Binder & Linker Data and Subprograms -- + ---------------------------------------------------- + +! Gcc : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("adagcc"); + Gnatbind : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatbind"); + Gnatlink : String_Access := GNAT.OS_Lib.Locate_Exec_On_Path ("gnatlink"); + +*************** +*** 778,784 **** + Comp_Last := Comp_Last + 1; + Comp_Args (Comp_Last) := new String'(Name_Buffer (1 .. Name_Len)); + +! Display ("gcc", Comp_Args (Args'First .. Comp_Last)); + + return + GNAT.OS_Lib.Non_Blocking_Spawn +--- 778,784 ---- + Comp_Last := Comp_Last + 1; + Comp_Args (Comp_Last) := new String'(Name_Buffer (1 .. Name_Len)); + +! Display ("adagcc", Comp_Args (Args'First .. Comp_Last)); + + return + GNAT.OS_Lib.Non_Blocking_Spawn diff --git a/lang/gnat/files/patch-af b/lang/gnat/files/patch-af new file mode 100644 index 000000000000..ed40cbcf144f --- /dev/null +++ b/lang/gnat/files/patch-af @@ -0,0 +1,19 @@ +*** gcc/ada/gnatcmd.adb.orig Wed Jun 4 17:47:51 1997 +--- gcc-2.7.2.1/ada/gnatcmd.adb Wed Jun 4 17:48:17 1997 +*************** +*** 899,905 **** + + (Cname => new S'("COMPILE"), + Usage => new S'("GNAT COMPILE file file .. file /qualifiers"), +! Unixcmd => new S'("gcc -c"), + Switches => GCC_Switches'Access, + Minfile => 1, + Maxfile => 0, +--- 899,905 ---- + + (Cname => new S'("COMPILE"), + Usage => new S'("GNAT COMPILE file file .. file /qualifiers"), +! Unixcmd => new S'("adagcc -c"), + Switches => GCC_Switches'Access, + Minfile => 1, + Maxfile => 0, |