------------------------------------------------------------------------------ -- -- -- GNAT COMPILER COMPONENTS -- -- -- -- I N T E R F A C E S . O S 2 L I B . S Y N C H R O N I Z A T I O N -- -- -- -- S p e c -- -- -- -- Copyright (C) 1993-1998 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.OS2Lib.Threads; package Interfaces.OS2Lib.Synchronization is pragma Preelaborate (Synchronization); package IC renames Interfaces.C; package IOT renames Interfaces.OS2Lib.Threads; package S renames System; -- Semaphore Attributes DC_SEM_SHARED : constant := 16#01#; -- DosCreateMutex, DosCreateEvent, and DosCreateMuxWait use it to indicate -- whether the semaphore is shared or private when the PSZ is null SEM_INDEFINITE_WAIT : constant ULONG := -1; SEM_IMMEDIATE_RETURN : constant ULONG := 0; type HSEM is new LHANDLE; type PHSEM is access all HSEM; type SEMRECORD is record hsemCur : HSEM; ulUser : ULONG; end record; type PSEMRECORD is access all SEMRECORD; -- Quad word structure -- Originally QWORD is defined as a record containing two ULONGS, -- the first containing low word and the second for the high word, -- but it is cleaner to define it as follows: type QWORD is delta 1.0 range -2.0**63 .. 2.0**63 - 1.0; type PQWORD is access all QWORD; type HEV is new HSEM; type PHEV is access all HEV; type HMTX is new HSEM; type PHMTX is access all HMTX; type HMUX is new HSEM; type PHMUX is access all HMUX; type HTIMER is new LHANDLE; type PHTIMER is access all HTIMER; ----------------------- -- Critical sections -- ----------------------- function DosEnterCritSec return APIRET; pragma Import (C, DosEnterCritSec, "DosEnterCritSec"); function DosExitCritSec return APIRET; pragma Import (C, DosExitCritSec, "DosExitCritSec"); -------------- -- EventSem -- -------------- function DosCreateEventSem (pszName : PSZ; f_phev : PHEV; flAttr : ULONG; fState : BOOL32) return APIRET; pragma Import (C, DosCreateEventSem, "DosCreateEventSem"); function DosOpenEventSem (pszName : PSZ; F_phev : PHEV) return APIRET; pragma Import (C, DosOpenEventSem, "DosOpenEventSem"); function DosCloseEventSem (F_hev : HEV) return APIRET; pragma Import (C, DosCloseEventSem, "DosCloseEventSem"); function DosResetEventSem (F_hev : HEV; pulPostCt : PULONG) return APIRET; pragma Import (C, DosResetEventSem, "DosResetEventSem"); function DosPostEventSem (F_hev : HEV) return APIRET; pragma Import (C, DosPostEventSem, "DosPostEventSem"); function DosWaitEventSem (F_hev : HEV; ulTimeout : ULONG) return APIRET; pragma Import (C, DosWaitEventSem, "DosWaitEventSem"); function DosQueryEventSem (F_hev : HEV; pulPostCt : PULONG) return APIRET; pragma Import (C, DosQueryEventSem, "DosQueryEventSem"); -------------- -- MutexSem -- -------------- function DosCreateMutexSem (pszName : PSZ; F_phmtx : PHMTX; flAttr : ULONG; fState : BOOL32) return APIRET; pragma Import (C, DosCreateMutexSem, "DosCreateMutexSem"); function DosOpenMutexSem (pszName : PSZ; F_phmtx : PHMTX) return APIRET; pragma Import (C, DosOpenMutexSem, "DosOpenMutexSem"); function DosCloseMutexSem (F_hmtx : HMTX) return APIRET; pragma Import (C, DosCloseMutexSem, "DosCloseMutexSem"); function DosRequestMutexSem (F_hmtx : HMTX; ulTimeout : ULONG) return APIRET; pragma Import (C, DosRequestMutexSem, "DosRequestMutexSem"); function DosReleaseMutexSem (F_hmtx : HMTX) return APIRET; pragma Import (C, DosReleaseMutexSem, "DosReleaseMutexSem"); function DosQueryMutexSem (F_hmtx : HMTX; F_ppid : IOT.PPID; F_ptid : IOT.PTID; pulCount : PULONG) return APIRET; pragma Import (C, DosQueryMutexSem, "DosQueryMutexSem"); ---------------- -- MuxWaitSem -- ---------------- function DosCreateMuxWaitSem (pszName : PSZ; F_phmux : PHMUX; cSemRec : ULONG; pSemRec : PSEMRECORD; flAttr : ULONG) return APIRET; pragma Import (C, DosCreateMuxWaitSem, "DosCreateMuxWaitSem"); DCMW_WAIT_ANY : constant := 16#02#; -- wait on any event/mutex to occur DCMW_WAIT_ALL : constant := 16#04#; -- wait on all events/mutexes to occur -- Values for "flAttr" parameter in DosCreateMuxWaitSem call function DosOpenMuxWaitSem (pszName : PSZ; F_phmux : PHMUX) return APIRET; pragma Import (C, DosOpenMuxWaitSem, "DosOpenMuxWaitSem"); function DosCloseMuxWaitSem (F_hmux : HMUX) return APIRET; pragma Import (C, DosCloseMuxWaitSem, "DosCloseMuxWaitSem"); function DosWaitMuxWaitSem (F_hmux : HMUX; ulTimeout : ULONG; pulUser : PULONG) return APIRET; pragma Import (C, DosWaitMuxWaitSem, "DosWaitMuxWaitSem"); function DosAddMuxWaitSem (F_hmux : HMUX; pSemRec : PSEMRECORD) return APIRET; pragma Import (C, DosAddMuxWaitSem, "DosAddMuxWaitSem"); function DosDeleteMuxWaitSem (F_hmux : HMUX; F_hsem : HSEM) return APIRET; pragma Import (C, DosDeleteMuxWaitSem, "DosDeleteMuxWaitSem"); function DosQueryMuxWaitSem (F_hmux : HMUX; pcSemRec : PULONG; pSemRec : PSEMRECORD; pflAttr : PULONG) return APIRET; pragma Import (C, DosQueryMuxWaitSem, "DosQueryMuxWaitSem"); ----------- -- Timer -- ----------- function DosAsyncTimer (msec : ULONG; F_hsem : HSEM; F_phtimer : PHTIMER) return APIRET; pragma Import (C, DosAsyncTimer, "DosAsyncTimer"); function DosStartTimer (msec : ULONG; F_hsem : HSEM; F_phtimer : PHTIMER) return APIRET; pragma Import (C, DosStartTimer, "DosStartTimer"); function DosStopTimer (F_htimer : HTIMER) return APIRET; pragma Import (C, DosStopTimer, "DosStopTimer"); -- DosTmrQueryTime provides a snapshot of the time -- from the IRQ0 high resolution timer (Intel 8254) function DosTmrQueryTime (pqwTmrTime : access QWORD) -- Time in 8254 ticks (1_192_755.2 Hz) return APIRET; pragma Import (C, DosTmrQueryTime, "DosTmrQueryTime"); end Interfaces.OS2Lib.Synchronization;