------------------------------------------------------------------------------ -- -- -- 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: 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;