123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158 |
- {
- $Id$
- This file is part of the Free Pascal Run time library.
- Copyright (c) 2000 by the Free Pascal development team
- This File contains the OS indenpendend declartions for multi
- threading support in FPC
- See the File COPYING.FPC, included in this distribution,
- for details about the copyright.
- This program is distributed in the hope that it will be useful,
- but WITHOUT ANY WARRANTY; without even the implied warranty of
- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.
- **********************************************************************}
- const
- DefaultStackSize = 32768; { including 16384 margin for stackchecking }
- type
- TThreadFunc = function(parameter : pointer) : longint;
- // Function prototypes for TThreadManager Record.
- TBeginThreadHandler = Function (sa : Pointer;stacksize : dword; ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword; var ThreadId : THandle) : DWord;
- TEndThreadHandler = Procedure (ExitCode : DWord);
- // Used for Suspend/Resume/Kill
- TThreadHandler = Function (threadHandle : dword) : dword;
- TThreadSwitchHandler = Procedure;
- TWaitForThreadTerminateHandler = Function (threadHandle : dword; TimeoutMs : longint) : dword; {0=no timeout}
- TThreadSetPriorityHandler = Function (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
- TThreadGetPriorityHandler = Function (threadHandle : dword): Integer;
- TGetCurrentThreadIdHandler = Function : dword;
- TCriticalSectionHandler = Procedure (var cs);
- TInitThreadVarHandler = Procedure(var offset : dword;size : dword);
- TRelocateThreadVarHandler = Function(offset : dword) : pointer;
- TAllocateThreadVarsHandler = Procedure;
- TReleaseThreadVarsHandler = Procedure;
- // TThreadManager interface.
- TThreadManager = Record
- InitManager : Function : Boolean;
- DoneManager : Function : Boolean;
- BeginThread : TBeginThreadHandler;
- EndThread : TEndThreadHandler;
- SuspendThread : TThreadHandler;
- ResumeThread : TThreadHandler;
- KillThread : TThreadHandler;
- ThreadSwitch : TThreadSwitchHandler;
- WaitForThreadTerminate : TWaitForThreadTerminateHandler;
- ThreadSetPriority : TThreadSetPriorityHandler;
- ThreadGetPriority : TThreadGetPriorityHandler;
- GetCurrentThreadId : TGetCurrentThreadIdHandler;
- InitCriticalSection : TCriticalSectionHandler;
- DoneCriticalSection : TCriticalSectionHandler;
- EnterCriticalSection : TCriticalSectionHandler;
- LeaveCriticalSection : TCriticalSectionHandler;
- InitThreadVar : TInitThreadVarHandler;
- RelocateThreadVar : TRelocateThreadVarHandler;
- AllocateThreadVars : TAllocateThreadVarsHandler;
- ReleaseThreadVars : TReleaseThreadVarsHandler;
- end;
- {*****************************************************************************
- Thread Handler routines
- *****************************************************************************}
- Function GetThreadManager(Var TM : TThreadManager) : Boolean;
- Function SetThreadManager(Const NewTM : TThreadManager; Var OldTM : TThreadManager) : Boolean;
- Function SetThreadManager(Const NewTM : TThreadManager) : Boolean;
- Procedure SetNoThreadManager;
- // Needs to be exported, so the manager can call it.
- {$ifdef HASTHREADVAR}
- procedure InitThreadVars(RelocProc : Pointer);
- {$endif HASTHREADVAR}
- procedure InitThread(stklen:cardinal);
- {*****************************************************************************
- Multithread Handling
- *****************************************************************************}
- function BeginThread(sa : Pointer;stacksize : dword;
- ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword;
- var ThreadId : THandle) : DWord;
- {$ifndef CPU64}
- { Delphi uses a longint for threadid }
- function BeginThread(sa : Pointer;stacksize : dword;
- ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword;
- var ThreadId : Longint) : DWord;
- {$endif CPU64}
- { add some simplfied forms which make lifer easier and porting }
- { to other OSes too ... }
- function BeginThread(ThreadFunction : tthreadfunc) : DWord;
- function BeginThread(ThreadFunction : tthreadfunc;p : pointer) : DWord;
- function BeginThread(ThreadFunction : tthreadfunc;p : pointer; var ThreadId : THandle) : DWord;
- {$ifndef CPU64}
- function BeginThread(ThreadFunction : tthreadfunc;p : pointer; var ThreadId : Longint) : DWord;
- {$endif CPU64}
- procedure EndThread(ExitCode : DWord);
- procedure EndThread;
- {some thread support functions}
- function SuspendThread (threadHandle : dword) : dword;
- function ResumeThread (threadHandle : dword) : dword;
- procedure ThreadSwitch; {give time to other threads}
- function KillThread (threadHandle : dword) : dword;
- function WaitForThreadTerminate (threadHandle : dword; TimeoutMs : longint) : dword; {0=no timeout}
- function ThreadSetPriority (threadHandle : dword; Prio: longint): boolean; {-15..+15, 0=normal}
- function ThreadGetPriority (threadHandle : dword): Integer;
- function GetCurrentThreadId : dword;
- { this allows to do a lot of things in MT safe way }
- { it is also used to make the heap management }
- { thread safe }
- procedure InitCriticalSection(var cs : TRTLCriticalSection);
- procedure DoneCriticalsection(var cs : TRTLCriticalSection);
- procedure EnterCriticalsection(var cs : TRTLCriticalSection);
- procedure LeaveCriticalsection(var cs : TRTLCriticalSection);
- {
- $Log$
- Revision 1.15 2004-02-22 16:48:39 florian
- * several 64 bit issues fixed
- Revision 1.14 2003/11/29 17:29:32 michael
- + Added overloaded version of SetThreadManager without old parameter
- Revision 1.13 2003/11/27 10:28:41 michael
- + Patch from peter to fix make cycle
- Revision 1.12 2003/11/26 20:10:59 michael
- + New threadmanager implementation
- Revision 1.11 2003/10/01 21:00:09 peter
- * GetCurrentThreadHandle renamed to GetCurrentThreadId
- Revision 1.10 2003/03/27 17:14:27 armin
- * more platform independent thread routines, needs to be implemented for unix
- Revision 1.9 2002/10/16 19:04:27 michael
- + More system-independent thread routines
- Revision 1.8 2002/10/14 19:39:17 peter
- * threads unit added for thread support
- Revision 1.7 2002/09/07 15:07:46 peter
- * old logs removed and tabs fixed
- Revision 1.6 2002/07/28 20:43:48 florian
- * several fixes for linux/powerpc
- * several fixes to MT
- }
|