mirror of
				https://gitlab.com/freepascal.org/fpc/source.git
				synced 2025-11-04 07:59:34 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			168 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			168 lines
		
	
	
		
			8.3 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
{
 | 
						|
    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
 | 
						|
  { includes 16384 bytes margin for stackchecking }
 | 
						|
  DefaultStackSize = 4*1024*1024;
 | 
						|
 | 
						|
type
 | 
						|
  PEventState = pointer;
 | 
						|
  PRTLEvent   = type pointer;   // Windows=thandle, other=pointer to record.
 | 
						|
  TThreadFunc = function(parameter : pointer) : ptrint;
 | 
						|
  trtlmethod  = procedure of object;
 | 
						|
 | 
						|
  // Function prototypes for TThreadManager Record.
 | 
						|
  TBeginThreadHandler = Function (sa : Pointer;stacksize : PtrUInt; ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword; var ThreadId : TThreadID) : TThreadID;
 | 
						|
  TEndThreadHandler = Procedure (ExitCode : DWord);
 | 
						|
  // Used for Suspend/Resume/Kill
 | 
						|
  TThreadHandler = Function (threadHandle : TThreadID) : dword;
 | 
						|
  TThreadSwitchHandler = Procedure;
 | 
						|
  TWaitForThreadTerminateHandler = Function (threadHandle : TThreadID; TimeoutMs : longint) : dword;  {0=no timeout}
 | 
						|
  TThreadSetPriorityHandler = Function (threadHandle : TThreadID; Prio: longint): boolean;            {-15..+15, 0=normal}
 | 
						|
  TThreadGetPriorityHandler = Function (threadHandle : TThreadID): longint;
 | 
						|
  TGetCurrentThreadIdHandler = Function : TThreadID;
 | 
						|
  TCriticalSectionHandler = Procedure (var cs);
 | 
						|
  TCriticalSectionHandlerTryEnter = function (var cs):longint;
 | 
						|
  TInitThreadVarHandler = Procedure(var offset : dword;size : dword);
 | 
						|
  TRelocateThreadVarHandler = Function(offset : dword) : pointer;
 | 
						|
  TAllocateThreadVarsHandler = Procedure;
 | 
						|
  TReleaseThreadVarsHandler = Procedure;
 | 
						|
  TBasicEventHandler        = procedure(state:peventstate);
 | 
						|
  TBasicEventWaitForHandler = function (timeout:cardinal;state:peventstate):longint;
 | 
						|
  TBasicEventCreateHandler  = function (EventAttributes :Pointer;  AManualReset,InitialState : Boolean;const Name:ansistring):pEventState;
 | 
						|
  TRTLEventHandler          = procedure(AEvent:PRTLEvent);
 | 
						|
  TRTLEventHandlerTimeout   = procedure(AEvent:PRTLEvent;timeout : longint);
 | 
						|
  TRTLCreateEventHandler    = function:PRTLEvent;
 | 
						|
  TRTLEventSyncHandler      = procedure (m:trtlmethod;p:tprocedure);
 | 
						|
  // semaphores stuff
 | 
						|
  TSempahoreInitHandler     = function: Pointer;
 | 
						|
  TSemaphoreDestroyHandler  = procedure (const sem: Pointer);
 | 
						|
  TSemaphorePostHandler     = procedure (const sem: Pointer);
 | 
						|
  TSemaphoreWaitHandler     = procedure (const sem: Pointer);
 | 
						|
 | 
						|
  // TThreadManager interface.
 | 
						|
  TThreadManager = Record
 | 
						|
    InitManager            : Function : Boolean;
 | 
						|
    DoneManager            : Function : Boolean;
 | 
						|
    BeginThread            : TBeginThreadHandler;
 | 
						|
    EndThread              : TEndThreadHandler;
 | 
						|
    SuspendThread          : TThreadHandler;
 | 
						|
    ResumeThread           : TThreadHandler;
 | 
						|
    KillThread             : TThreadHandler;
 | 
						|
    CloseThread            : TThreadHandler;
 | 
						|
    ThreadSwitch           : TThreadSwitchHandler;
 | 
						|
    WaitForThreadTerminate : TWaitForThreadTerminateHandler;
 | 
						|
    ThreadSetPriority      : TThreadSetPriorityHandler;
 | 
						|
    ThreadGetPriority      : TThreadGetPriorityHandler;
 | 
						|
    GetCurrentThreadId     : TGetCurrentThreadIdHandler;
 | 
						|
    InitCriticalSection    : TCriticalSectionHandler;
 | 
						|
    DoneCriticalSection    : TCriticalSectionHandler;
 | 
						|
    EnterCriticalSection   : TCriticalSectionHandler;
 | 
						|
    TryEnterCriticalSection: TCriticalSectionHandlerTryEnter;
 | 
						|
    LeaveCriticalSection   : TCriticalSectionHandler;
 | 
						|
    InitThreadVar          : TInitThreadVarHandler;
 | 
						|
    RelocateThreadVar      : TRelocateThreadVarHandler;
 | 
						|
    AllocateThreadVars     : TAllocateThreadVarsHandler;
 | 
						|
    ReleaseThreadVars      : TReleaseThreadVarsHandler;
 | 
						|
    BasicEventCreate       : TBasicEventCreateHandler;      // left in for a while.
 | 
						|
    BasicEventDestroy      : TBasicEventHandler;            // we might need BasicEvent
 | 
						|
    BasicEventResetEvent   : TBasicEventHandler;            // for a real TEvent
 | 
						|
    BasicEventSetEvent     : TBasicEventHandler;
 | 
						|
    BasiceventWaitFOr      : TBasicEventWaitForHandler;
 | 
						|
    RTLEventCreate         : TRTLCreateEventHandler;
 | 
						|
    RTLEventDestroy        : TRTLEventHandler;
 | 
						|
    RTLEventSetEvent       : TRTLEventHandler;
 | 
						|
    RTLEventResetEvent     : TRTLEventHandler;
 | 
						|
    RTLEventWaitFor        : TRTLEventHandler;
 | 
						|
    RTLEventSync           : TRTLEventSyncHandler;
 | 
						|
    RTLEventWaitForTimeout : TRTLEventHandlerTimeout;
 | 
						|
    // semaphores stuff
 | 
						|
    SemaphoreInit          : TSempahoreInitHandler;
 | 
						|
    SemaphoreDestroy       : TSemaphoreDestroyHandler;
 | 
						|
    SemaphorePost          : TSemaphorePostHandler;
 | 
						|
    SemaphoreWait          : TSemaphoreWaitHandler;
 | 
						|
  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;
 | 
						|
{$ifndef DISABLE_NO_THREAD_MANAGER}
 | 
						|
{$endif DISABLE_NO_THREAD_MANAGER}
 | 
						|
// Needs to be exported, so the manager can call it.
 | 
						|
procedure InitThreadVars(RelocProc : Pointer);
 | 
						|
procedure InitThread(stklen:SizeUInt);
 | 
						|
procedure DoneThread;
 | 
						|
 | 
						|
{*****************************************************************************
 | 
						|
                         Multithread Handling
 | 
						|
*****************************************************************************}
 | 
						|
 | 
						|
function BeginThread(sa : Pointer;stacksize : SizeUInt;
 | 
						|
  ThreadFunction : tthreadfunc;p : pointer;creationFlags : dword;
 | 
						|
  var ThreadId : TThreadID) : TThreadID;
 | 
						|
 | 
						|
{ add some simplfied forms which make lifer easier and porting }
 | 
						|
{ to other OSes too ...                                        }
 | 
						|
function BeginThread(ThreadFunction : tthreadfunc) : TThreadID;
 | 
						|
function BeginThread(ThreadFunction : tthreadfunc;p : pointer) : TThreadID;
 | 
						|
function BeginThread(ThreadFunction : tthreadfunc;p : pointer; var ThreadId : TThreadID) : TThreadID;
 | 
						|
function BeginThread(ThreadFunction : tthreadfunc;p : pointer;
 | 
						|
                     var ThreadId : TThreadID; const stacksize: SizeUInt) : TThreadID;
 | 
						|
 | 
						|
procedure EndThread(ExitCode : DWord);
 | 
						|
procedure EndThread;
 | 
						|
 | 
						|
{some thread support functions}
 | 
						|
procedure FlushThread;
 | 
						|
function  SuspendThread (threadHandle : TThreadID) : dword;
 | 
						|
function  ResumeThread  (threadHandle : TThreadID) : dword;
 | 
						|
function  CloseThread   (threadHandle : TThreadID) : dword;
 | 
						|
procedure ThreadSwitch;                                                                {give time to other threads}
 | 
						|
function  KillThread (threadHandle : TThreadID) : dword;
 | 
						|
function  WaitForThreadTerminate (threadHandle : TThreadID; TimeoutMs : longint) : dword;  {0=no timeout}
 | 
						|
function  ThreadSetPriority (threadHandle : TThreadID; Prio: longint): boolean;            {-15..+15, 0=normal}
 | 
						|
function  ThreadGetPriority (threadHandle : TThreadID): longint;
 | 
						|
function  GetCurrentThreadId : TThreadID;
 | 
						|
 | 
						|
 | 
						|
{ 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);
 | 
						|
function  TryEnterCriticalsection(var cs : TRTLCriticalSection):longint;
 | 
						|
function  BasicEventCreate(EventAttributes : Pointer; AManualReset,InitialState : Boolean;const Name : ansistring):pEventState;
 | 
						|
procedure basiceventdestroy(state:peventstate);
 | 
						|
procedure basiceventResetEvent(state:peventstate);
 | 
						|
procedure basiceventSetEvent(state:peventstate);
 | 
						|
function  basiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
 | 
						|
 | 
						|
function  RTLEventCreate :PRTLEvent;
 | 
						|
procedure RTLeventdestroy(state:pRTLEvent);
 | 
						|
procedure RTLeventSetEvent(state:pRTLEvent);
 | 
						|
procedure RTLeventResetEvent(state:pRTLEvent);
 | 
						|
procedure RTLeventWaitFor(state:pRTLEvent);
 | 
						|
procedure RTLeventWaitFor(state:pRTLEvent;timeout : longint);
 | 
						|
procedure RTLeventsync(m:trtlmethod;p:tprocedure);
 | 
						|
 |