------------------------------------------------------------------------------
--                                                                          --
--                         GNAT COMPILER COMPONENTS                         --
--                                                                          --
--             I N T E R F A C E S . O S 2 L I B . T H R E A D S            --
--                                                                          --
--                                  S p e c                                 --
--                                                                          --
--          Copyright (C) 1993-2004 Free Software Foundation, Inc.          --
--                                                                          --
-- GNAT is free software;  you can  redistribute it  and/or modify it under --
-- terms of the  GNU General Public License as published  by the Free Soft- --
-- ware  Foundation;  either version 2,  or (at your option) any later ver- --
-- sion.  GNAT is distributed in the hope that it will be useful, but WITH- --
-- OUT ANY WARRANTY;  without even the  implied warranty of MERCHANTABILITY --
-- or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License --
-- for  more details.  You should have  received  a copy of the GNU General --
-- Public License  distributed with GNAT;  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.                                      --
--                                                                          --
-- GNAT was originally developed  by the GNAT team at  New York University. --
-- Extensive contributions were provided by Ada Core Technologies Inc.      --
--                                                                          --
------------------------------------------------------------------------------

with Interfaces.C;

package Interfaces.OS2Lib.Threads is
pragma Preelaborate (Threads);

   package IC renames Interfaces.C;

   type PID is new IC.unsigned_long;
   type PPID is access all PID;
   --  Process ID, and pointer to process ID

   type TID is new IC.unsigned_long;
   type PTID is access all TID;
   --  Thread ID, and pointer to thread ID

   -------------------------------------------------------------
   -- Thread Creation, Activation, Suspension And Termination --
   -------------------------------------------------------------

   --  Note: <bsedos.h> defines the "Informations" and "param" parameter below
   --  as a ULONG, but everyone knows that in general an address will be passed
   --  to it. We declared it here with type PVOID (which it should have had)
   --  because Ada is a bit more sensitive to mixing integers and addresses.

   type PFNTHREAD is access procedure (Informations : System.Address);
   --  TBSL should use PVOID instead of Address as per above node ???

   function DosCreateThread
     (F_ptid  : PTID;
      pfn     : PFNTHREAD;
      param   : PVOID;
      flag    : ULONG;
      cbStack : ULONG) return APIRET;
   pragma Import (C, DosCreateThread, "DosCreateThread");

   Block_Child     : constant := 1;
   No_Block_Child  : constant := 0;
   Commit_Stack    : constant := 2;
   No_Commit_Stack : constant := 0;
   --  Values for "flag" parameter in DosCreateThread call

   procedure DosExit (Action : ULONG; Result : ULONG);
   pragma Import (C, DosExit, "DosExit");

   EXIT_THREAD  : constant := 0;
   EXIT_PROCESS : constant := 1;
   --  Values for "Action" parameter in Dos_Exit call

   function DosResumeThread (Id : TID) return APIRET;
   pragma Import (C, DosResumeThread, "DosResumeThread");

   function DosSuspendThread (Id : TID) return APIRET;
   pragma Import (C, DosSuspendThread, "DosSuspendThread");

   procedure DosWaitThread (Thread_Ptr : PTID; Option : ULONG);
   pragma Import (C, DosWaitThread, "DosWaitThread");

   function DosKillThread (Id : TID) return APIRET;
   pragma Import (C, DosKillThread, "DosKillThread");


   DCWW_WAIT   : constant := 0;
   DCWW_NOWAIT : constant := 1;
   --  Values for "Option" parameter in DosWaitThread call

   ---------------------------------------------------
   -- Accessing properties of Threads and Processes --
   ---------------------------------------------------

   --  Structures translated from BSETIB.H

   --  Thread Information Block (TIB)
   --  Need documentation clarifying distinction between TIB, TIB2 ???

   --  GB970409: Changed TIB2 structure, because the tib2_ulprio field
   --            is not the actual priority but contains two byte fields
   --            that hold the priority class and rank respectively.
   --            A proper Ada style record with explicit representation
   --            avoids this kind of errors.

   type TIB2 is record
      Thread_ID           : TID;
      Prio_Rank           : UCHAR;
      Prio_Class          : UCHAR;
      Version             : ULONG;  -- Version number for this structure
      Must_Complete_Count : USHORT; -- Must Complete count
      Must_Complete_Force : USHORT; -- Must Complete force flag
   end record;

   type PTIB2 is access all TIB2;

   --  Thread Information Block (TIB)

   type TIB is record
      tib_pexchain      : PVOID;  -- Head of exception handler chain
      tib_pstack        : PVOID;  -- Pointer to base of stack
      tib_pstacklimit   : PVOID;  -- Pointer to end of stack
      System            : PTIB2;  -- Pointer to system specific TIB
      tib_version       : ULONG;  -- Version number for this TIB structure
      tib_ordinal       : ULONG;  -- Thread ordinal number
   end record;

   type PTIB is access all TIB;

   --  Process Information Block (PIB)

   type PIB is record
      pib_ulpid         : ULONG;   -- Process I.D.
      pib_ulppid        : ULONG;   -- Parent process I.D.
      pib_hmte          : ULONG;   -- Program (.EXE) module handle
      pib_pchcmd        : PCHAR;   -- Command line pointer
      pib_pchenv        : PCHAR;   -- Environment pointer
      pib_flstatus      : ULONG;   -- Process' status bits
      pib_ultype        : ULONG;   -- Process' type code
   end record;

   type PPIB is access all PIB;

   function DosGetInfoBlocks
     (Pptib : access PTIB;
      Pppib : access PPIB) return APIRET;
   pragma Import (C, DosGetInfoBlocks, "DosGetInfoBlocks");

   --  Thread local memory

   --  This function allocates a block of memory that is unique, or local, to
   --  a thread.

   function DosAllocThreadLocalMemory
     (cb : ULONG;               -- Number of 4-byte DWORDs to allocate
      p  : access PVOID)        -- Address of the memory block
      return APIRET;                   -- Return Code (rc)
   pragma Import
     (Convention => C,
      Entity     => DosAllocThreadLocalMemory,
      Link_Name  => "_DosAllocThreadLocalMemory");

   ----------------
   -- Priorities --
   ----------------

   function DosSetPriority
     (Scope   : ULONG;
      Class   : ULONG;
      Delta_P : IC.long;
      PorTid  : TID) return APIRET;
   pragma Import (C, DosSetPriority, "DosSetPriority");

   PRTYS_PROCESS     : constant := 0;
   PRTYS_PROCESSTREE : constant := 1;
   PRTYS_THREAD      : constant := 2;
   --  Values for "Scope" parameter in DosSetPriority call

   PRTYC_NOCHANGE         : constant := 0;
   PRTYC_IDLETIME         : constant := 1;
   PRTYC_REGULAR          : constant := 2;
   PRTYC_TIMECRITICAL     : constant := 3;
   PRTYC_FOREGROUNDSERVER : constant := 4;
   --  Values for "class" parameter in DosSetPriority call

end Interfaces.OS2Lib.Threads;
