mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-08-11 09:06:14 +02:00
--- Merging r45159 into '.':
U rtl/nativent/systhrd.inc U rtl/os2/systhrd.inc U rtl/win/systhrd.inc --- Recording mergeinfo for merge of r45159 into '.': U . --- Merging r45160 into '.': U rtl/amicommon/athreads.pp U rtl/beos/bethreads.pp U rtl/inc/thread.inc U rtl/inc/threadh.inc G rtl/nativent/systhrd.inc U rtl/netware/systhrd.inc U rtl/netwlibc/systhrd.inc U rtl/objpas/classes/classes.inc U rtl/objpas/classes/classesh.inc G rtl/os2/systhrd.inc U rtl/unix/cthreads.pp G rtl/win/systhrd.inc --- Recording mergeinfo for merge of r45160 into '.': G . --- Merging r45206 into '.': U rtl/win/sysos.inc G rtl/win/systhrd.inc U rtl/win/syswin.inc --- Recording mergeinfo for merge of r45206 into '.': G . --- Merging r45207 into '.': U rtl/linux/pthread.inc --- Recording mergeinfo for merge of r45207 into '.': G . --- Merging r45233 into '.': G rtl/linux/pthread.inc G rtl/unix/cthreads.pp --- Recording mergeinfo for merge of r45233 into '.': G . --- Merging r45237 into '.': G rtl/unix/cthreads.pp G rtl/win/systhrd.inc --- Recording mergeinfo for merge of r45237 into '.': G . git-svn-id: branches/fixes_3_2@47806 -
This commit is contained in:
parent
c60ce2af07
commit
74a1b6406e
@ -738,6 +738,18 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure ASetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure ASetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
ASetThreadDebugNameA(threadHandle, AnsiString(ThreadName));
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
Type PINTRTLEvent = ^TINTRTLEvent;
|
Type PINTRTLEvent = ^TINTRTLEvent;
|
||||||
TINTRTLEvent = record
|
TINTRTLEvent = record
|
||||||
isset: boolean;
|
isset: boolean;
|
||||||
@ -1220,6 +1232,8 @@ begin
|
|||||||
ThreadSetPriority :=@AThreadSetPriority;
|
ThreadSetPriority :=@AThreadSetPriority;
|
||||||
ThreadGetPriority :=@AThreadGetPriority;
|
ThreadGetPriority :=@AThreadGetPriority;
|
||||||
GetCurrentThreadId :=@AGetCurrentThreadId;
|
GetCurrentThreadId :=@AGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@ASetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@ASetThreadDebugNameU;
|
||||||
InitCriticalSection :=@AInitCriticalSection;
|
InitCriticalSection :=@AInitCriticalSection;
|
||||||
DoneCriticalSection :=@ADoneCriticalSection;
|
DoneCriticalSection :=@ADoneCriticalSection;
|
||||||
EnterCriticalSection :=@AEnterCriticalSection;
|
EnterCriticalSection :=@AEnterCriticalSection;
|
||||||
|
@ -263,6 +263,15 @@ Uses
|
|||||||
CGetCurrentThreadId:=dword(pthread_self());
|
CGetCurrentThreadId:=dword(pthread_self());
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure BeSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure BeSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
@ -494,6 +503,8 @@ begin
|
|||||||
ThreadSetPriority :=@BeThreadSetPriority;
|
ThreadSetPriority :=@BeThreadSetPriority;
|
||||||
ThreadGetPriority :=@BeThreadGetPriority;
|
ThreadGetPriority :=@BeThreadGetPriority;
|
||||||
GetCurrentThreadId :=@BeGetCurrentThreadId;
|
GetCurrentThreadId :=@BeGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@BeSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@BeSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@BeInitCriticalSection;
|
InitCriticalSection :=@BeInitCriticalSection;
|
||||||
DoneCriticalSection :=@BeDoneCriticalSection;
|
DoneCriticalSection :=@BeDoneCriticalSection;
|
||||||
EnterCriticalSection :=@BeEnterCriticalSection;
|
EnterCriticalSection :=@BeEnterCriticalSection;
|
||||||
|
@ -205,6 +205,18 @@ begin
|
|||||||
Result:=CurrentTM.GetCurrentThreadID();
|
Result:=CurrentTM.GetCurrentThreadID();
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SetThreadDebugName(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
CurrentTM.SetThreadDebugNameA(threadHandle, ThreadName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
procedure SetThreadDebugName(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
CurrentTM.SetThreadDebugNameU(threadHandle, ThreadName);
|
||||||
|
end;
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
|
||||||
procedure InitCriticalSection(var cs : TRTLCriticalSection);
|
procedure InitCriticalSection(var cs : TRTLCriticalSection);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -403,6 +415,18 @@ begin
|
|||||||
result:=TThreadID(1);
|
result:=TThreadID(1);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure NoSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
NoThreadError;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
procedure NoSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
NoThreadError;
|
||||||
|
end;
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
|
||||||
procedure NoCriticalSection(var CS);
|
procedure NoCriticalSection(var CS);
|
||||||
|
|
||||||
begin
|
begin
|
||||||
@ -511,6 +535,10 @@ const
|
|||||||
ThreadSetPriority : TThreadSetPriorityHandler(@NoThreadError);
|
ThreadSetPriority : TThreadSetPriorityHandler(@NoThreadError);
|
||||||
ThreadGetPriority : TThreadGetPriorityHandler(@NoThreadError);
|
ThreadGetPriority : TThreadGetPriorityHandler(@NoThreadError);
|
||||||
GetCurrentThreadId : @NoGetCurrentThreadId;
|
GetCurrentThreadId : @NoGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA : TThreadSetThreadDebugNameHandlerA(@NoThreadError);
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
SetThreadDebugNameU : TThreadSetThreadDebugNameHandlerU(@NoThreadError);
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
InitCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
InitCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
||||||
DoneCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
DoneCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
||||||
EnterCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
EnterCriticalSection : TCriticalSectionHandler(@NoThreadError);
|
||||||
@ -543,6 +571,10 @@ const
|
|||||||
ThreadSetPriority : @NoThreadSetPriority;
|
ThreadSetPriority : @NoThreadSetPriority;
|
||||||
ThreadGetPriority : @NoThreadGetPriority;
|
ThreadGetPriority : @NoThreadGetPriority;
|
||||||
GetCurrentThreadId : @NoGetCurrentThreadId;
|
GetCurrentThreadId : @NoGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA : @NoSetThreadDebugNameA;
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
SetThreadDebugNameU : @NoSetThreadDebugNameU;
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
InitCriticalSection : @NoCriticalSection;
|
InitCriticalSection : @NoCriticalSection;
|
||||||
DoneCriticalSection : @NoCriticalSection;
|
DoneCriticalSection : @NoCriticalSection;
|
||||||
EnterCriticalSection : @NoCriticalSection;
|
EnterCriticalSection : @NoCriticalSection;
|
||||||
|
@ -45,6 +45,10 @@ type
|
|||||||
TThreadSetPriorityHandler = Function (threadHandle : TThreadID; Prio: longint): boolean; {-15..+15, 0=normal}
|
TThreadSetPriorityHandler = Function (threadHandle : TThreadID; Prio: longint): boolean; {-15..+15, 0=normal}
|
||||||
TThreadGetPriorityHandler = Function (threadHandle : TThreadID): longint;
|
TThreadGetPriorityHandler = Function (threadHandle : TThreadID): longint;
|
||||||
TGetCurrentThreadIdHandler = Function : TThreadID;
|
TGetCurrentThreadIdHandler = Function : TThreadID;
|
||||||
|
TThreadSetThreadDebugNameHandlerA = procedure(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
TThreadSetThreadDebugNameHandlerU = procedure(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
TCriticalSectionHandler = Procedure (var cs);
|
TCriticalSectionHandler = Procedure (var cs);
|
||||||
TCriticalSectionHandlerTryEnter = function (var cs):longint;
|
TCriticalSectionHandlerTryEnter = function (var cs):longint;
|
||||||
TInitThreadVarHandler = Procedure(var offset : {$ifdef cpu16}word{$else}dword{$endif};size : dword);
|
TInitThreadVarHandler = Procedure(var offset : {$ifdef cpu16}word{$else}dword{$endif};size : dword);
|
||||||
@ -78,6 +82,10 @@ type
|
|||||||
ThreadSetPriority : TThreadSetPriorityHandler;
|
ThreadSetPriority : TThreadSetPriorityHandler;
|
||||||
ThreadGetPriority : TThreadGetPriorityHandler;
|
ThreadGetPriority : TThreadGetPriorityHandler;
|
||||||
GetCurrentThreadId : TGetCurrentThreadIdHandler;
|
GetCurrentThreadId : TGetCurrentThreadIdHandler;
|
||||||
|
SetThreadDebugNameA : TThreadSetThreadDebugNameHandlerA;
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
SetThreadDebugNameU : TThreadSetThreadDebugNameHandlerU;
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
InitCriticalSection : TCriticalSectionHandler;
|
InitCriticalSection : TCriticalSectionHandler;
|
||||||
DoneCriticalSection : TCriticalSectionHandler;
|
DoneCriticalSection : TCriticalSectionHandler;
|
||||||
EnterCriticalSection : TCriticalSectionHandler;
|
EnterCriticalSection : TCriticalSectionHandler;
|
||||||
@ -147,6 +155,10 @@ function WaitForThreadTerminate (threadHandle : TThreadID; TimeoutMs : longint)
|
|||||||
function ThreadSetPriority (threadHandle : TThreadID; Prio: longint): boolean; {-15..+15, 0=normal}
|
function ThreadSetPriority (threadHandle : TThreadID; Prio: longint): boolean; {-15..+15, 0=normal}
|
||||||
function ThreadGetPriority (threadHandle : TThreadID): longint;
|
function ThreadGetPriority (threadHandle : TThreadID): longint;
|
||||||
function GetCurrentThreadId : TThreadID;
|
function GetCurrentThreadId : TThreadID;
|
||||||
|
procedure SetThreadDebugName(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
{$ifdef FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
procedure SetThreadDebugName(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
{$endif FPC_HAS_FEATURE_UNICODESTRINGS}
|
||||||
|
|
||||||
|
|
||||||
{ this allows to do a lot of things in MT safe way }
|
{ this allows to do a lot of things in MT safe way }
|
||||||
|
@ -143,33 +143,41 @@ Type
|
|||||||
function pthread_mutex_unlock(__mutex:ppthread_mutex_t):longint;cdecl;external;
|
function pthread_mutex_unlock(__mutex:ppthread_mutex_t):longint;cdecl;external;
|
||||||
function pthread_mutexattr_init(__attr:ppthread_mutexattr_t):longint;cdecl;external;
|
function pthread_mutexattr_init(__attr:ppthread_mutexattr_t):longint;cdecl;external;
|
||||||
function pthread_mutexattr_destroy(__attr:ppthread_mutexattr_t):longint;cdecl;external;
|
function pthread_mutexattr_destroy(__attr:ppthread_mutexattr_t):longint;cdecl;external;
|
||||||
|
{$ifndef ANDROID}
|
||||||
function pthread_mutexattr_setkind_np(__attr:ppthread_mutexattr_t; __kind:longint):longint;cdecl;external;
|
function pthread_mutexattr_setkind_np(__attr:ppthread_mutexattr_t; __kind:longint):longint;cdecl;external;
|
||||||
function pthread_mutexattr_getkind_np(__attr:ppthread_mutexattr_t; __kind:plongint):longint;cdecl;external;
|
function pthread_mutexattr_getkind_np(__attr:ppthread_mutexattr_t; __kind:plongint):longint;cdecl;external;
|
||||||
|
{$endif}
|
||||||
function pthread_cond_init(__cond:ppthread_cond_t; __cond_attr:ppthread_condattr_t):longint;cdecl;external;
|
function pthread_cond_init(__cond:ppthread_cond_t; __cond_attr:ppthread_condattr_t):longint;cdecl;external;
|
||||||
function pthread_cond_destroy(__cond:ppthread_cond_t):longint;cdecl;external;
|
function pthread_cond_destroy(__cond:ppthread_cond_t):longint;cdecl;external;
|
||||||
function pthread_cond_signal(__cond:ppthread_cond_t):longint;cdecl;external;
|
function pthread_cond_signal(__cond:ppthread_cond_t):longint;cdecl;external;
|
||||||
function pthread_cond_broadcast(__cond:ppthread_cond_t):longint;cdecl;external;
|
function pthread_cond_broadcast(__cond:ppthread_cond_t):longint;cdecl;external;
|
||||||
function pthread_cond_wait(__cond:ppthread_cond_t; __mutex:ppthread_mutex_t):longint;cdecl;external;
|
function pthread_cond_wait(__cond:ppthread_cond_t; __mutex:ppthread_mutex_t):longint;cdecl;external;
|
||||||
function pthread_cond_timedwait(__cond:ppthread_cond_t; __mutex:ppthread_mutex_t; __abstime:ptimespec):longint;cdecl;external;
|
function pthread_cond_timedwait(__cond:ppthread_cond_t; __mutex:ppthread_mutex_t; __abstime:ptimespec):longint;cdecl;external;
|
||||||
|
{$ifndef ANDROID}
|
||||||
function pthread_condattr_init(__attr:ppthread_condattr_t):longint;cdecl;external;
|
function pthread_condattr_init(__attr:ppthread_condattr_t):longint;cdecl;external;
|
||||||
function pthread_condattr_destroy(__attr:ppthread_condattr_t):longint;cdecl;external;
|
function pthread_condattr_destroy(__attr:ppthread_condattr_t):longint;cdecl;external;
|
||||||
function pthread_condattr_setclock(__attr:ppthread_condattr_t; __clock_id: longint):longint;cdecl;external;
|
function pthread_condattr_setclock(__attr:ppthread_condattr_t; __clock_id: longint):longint;cdecl;external;
|
||||||
|
{$endif}
|
||||||
function pthread_key_create(__key:ppthread_key_t; __destr_function:__destr_function_t):longint;cdecl;external;
|
function pthread_key_create(__key:ppthread_key_t; __destr_function:__destr_function_t):longint;cdecl;external;
|
||||||
function pthread_key_delete(__key:pthread_key_t):longint;cdecl;external;
|
function pthread_key_delete(__key:pthread_key_t):longint;cdecl;external;
|
||||||
function pthread_setspecific(__key:pthread_key_t; __pointer:pointer):longint;cdecl;external;
|
function pthread_setspecific(__key:pthread_key_t; __pointer:pointer):longint;cdecl;external;
|
||||||
function pthread_getspecific(__key:pthread_key_t):pointer;cdecl;external;
|
function pthread_getspecific(__key:pthread_key_t):pointer;cdecl;external;
|
||||||
{ function pthread_once(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;external;}
|
{ function pthread_once(__once_control:ppthread_once_t; __init_routine:tprocedure ):longint;cdecl;external;}
|
||||||
|
{$ifndef ANDROID}
|
||||||
function pthread_setcancelstate(__state:longint; __oldstate:plongint):longint;cdecl;external;
|
function pthread_setcancelstate(__state:longint; __oldstate:plongint):longint;cdecl;external;
|
||||||
function pthread_setcanceltype(__type:longint; __oldtype:plongint):longint;cdecl;external;
|
function pthread_setcanceltype(__type:longint; __oldtype:plongint):longint;cdecl;external;
|
||||||
function pthread_cancel(__thread:pthread_t):longint;cdecl;external;
|
function pthread_cancel(__thread:pthread_t):longint;cdecl;external;
|
||||||
procedure pthread_testcancel;cdecl;external;
|
procedure pthread_testcancel;cdecl;external;
|
||||||
|
{$endif}
|
||||||
{ procedure _pthread_cleanup_push(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;external; }
|
{ procedure _pthread_cleanup_push(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_routine; __arg:pointer);cdecl;external; }
|
||||||
{ procedure _pthread_cleanup_push_defer(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;external;}
|
{ procedure _pthread_cleanup_push_defer(__buffer:p_pthread_cleanup_buffer;__routine:t_pthread_cleanup_push_defer_routine; __arg:pointer);cdecl;external;}
|
||||||
{ function pthread_sigmask(__how:longint; __newmask:plibc_sigset; __oldmask:plibc_sigset):longint;cdecl;external;}
|
{ function pthread_sigmask(__how:longint; __newmask:plibc_sigset; __oldmask:plibc_sigset):longint;cdecl;external;}
|
||||||
function pthread_kill(__thread:pthread_t; __signo:longint):longint;cdecl;external;
|
function pthread_kill(__thread:pthread_t; __signo:longint):longint;cdecl;external;
|
||||||
{ function sigwait(__set:plibc_sigset; __sig:plongint):longint;cdecl;external;}
|
{ function sigwait(__set:plibc_sigset; __sig:plongint):longint;cdecl;external;}
|
||||||
|
{$ifndef ANDROID}
|
||||||
function pthread_atfork(__prepare:tprocedure ; __parent:tprocedure ; __child:tprocedure ):longint;cdecl;external;
|
function pthread_atfork(__prepare:tprocedure ; __parent:tprocedure ; __child:tprocedure ):longint;cdecl;external;
|
||||||
procedure pthread_kill_other_threads_np;cdecl;external;
|
procedure pthread_kill_other_threads_np;cdecl;external;
|
||||||
|
{$endif}
|
||||||
function pthread_sigmask(how: cint; nset: plibc_sigset; oset: plibc_sigset): cint; cdecl; external;
|
function pthread_sigmask(how: cint; nset: plibc_sigset; oset: plibc_sigset): cint; cdecl; external;
|
||||||
|
|
||||||
function sem_init (__sem:Psem_t; __pshared:longint; __value:dword):longint;cdecl;external;
|
function sem_init (__sem:Psem_t; __pshared:longint; __value:dword):longint;cdecl;external;
|
||||||
@ -183,6 +191,7 @@ Type
|
|||||||
function sem_getvalue (__sem:Psem_t; __sval:Plongint):longint;cdecl;external;
|
function sem_getvalue (__sem:Psem_t; __sval:Plongint):longint;cdecl;external;
|
||||||
|
|
||||||
function pthread_mutexattr_settype (__attr: Ppthread_mutexattr_t; Kind:Integer): Integer; cdecl;external;
|
function pthread_mutexattr_settype (__attr: Ppthread_mutexattr_t; Kind:Integer): Integer; cdecl;external;
|
||||||
|
function pthread_setname_np(thread: pthread_t; name: PAnsiChar):cint;cdecl;external;
|
||||||
|
|
||||||
{$else}
|
{$else}
|
||||||
Var
|
Var
|
||||||
@ -264,6 +273,7 @@ Var
|
|||||||
sem_getvalue : function (__sem:Psem_t; __sval:Plongint):longint;cdecl;
|
sem_getvalue : function (__sem:Psem_t; __sval:Plongint):longint;cdecl;
|
||||||
|
|
||||||
pthread_mutexattr_settype : function(__attr: Ppthread_mutexattr_t; Kind:Integer): Integer; cdecl;
|
pthread_mutexattr_settype : function(__attr: Ppthread_mutexattr_t; Kind:Integer): Integer; cdecl;
|
||||||
|
pthread_setname_np : function(thread: pthread_t; name: PAnsiChar):cint;cdecl;
|
||||||
|
|
||||||
|
|
||||||
Var
|
Var
|
||||||
@ -355,6 +365,7 @@ begin
|
|||||||
Pointer(sem_post ) := dlsym(PthreadDLL,'sem_post');
|
Pointer(sem_post ) := dlsym(PthreadDLL,'sem_post');
|
||||||
Pointer(sem_getvalue ) := dlsym(PthreadDLL,'sem_getvalue');
|
Pointer(sem_getvalue ) := dlsym(PthreadDLL,'sem_getvalue');
|
||||||
Pointer(pthread_mutexattr_settype) := dlsym(PthreadDLL,'pthread_mutexattr_settype');
|
Pointer(pthread_mutexattr_settype) := dlsym(PthreadDLL,'pthread_mutexattr_settype');
|
||||||
|
Pointer(pthread_setname_np) := dlsym(PthreadDLL,'pthread_setname_np');
|
||||||
end;
|
end;
|
||||||
|
|
||||||
Function UnLoadPthreads : Boolean;
|
Function UnLoadPthreads : Boolean;
|
||||||
|
@ -130,6 +130,14 @@ const
|
|||||||
Result := 0;
|
Result := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -231,11 +239,13 @@ begin
|
|||||||
ResumeThread :=@SysResumeThread;
|
ResumeThread :=@SysResumeThread;
|
||||||
KillThread :=@SysKillThread;
|
KillThread :=@SysKillThread;
|
||||||
ThreadSwitch :=@SysThreadSwitch;
|
ThreadSwitch :=@SysThreadSwitch;
|
||||||
CloseThread :=@SysCloseThread;
|
CloseThread :=@SysCloseThread;
|
||||||
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
||||||
ThreadSetPriority :=@SysThreadSetPriority;
|
ThreadSetPriority :=@SysThreadSetPriority;
|
||||||
ThreadGetPriority :=@SysThreadGetPriority;
|
ThreadGetPriority :=@SysThreadGetPriority;
|
||||||
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@SysSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@SysSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@SysInitCriticalSection;
|
InitCriticalSection :=@SysInitCriticalSection;
|
||||||
DoneCriticalSection :=@SysDoneCriticalSection;
|
DoneCriticalSection :=@SysDoneCriticalSection;
|
||||||
EnterCriticalSection :=@SysEnterCriticalSection;
|
EnterCriticalSection :=@SysEnterCriticalSection;
|
||||||
|
@ -244,13 +244,20 @@ begin
|
|||||||
SysThreadGetPriority := 0;
|
SysThreadGetPriority := 0;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function SysGetCurrentThreadId : dword;
|
function SysGetCurrentThreadId : dword;
|
||||||
begin
|
begin
|
||||||
SysGetCurrentThreadId := CGetThreadID;
|
SysGetCurrentThreadId := CGetThreadID;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
{ netware requires all allocated semaphores }
|
{ netware requires all allocated semaphores }
|
||||||
{ to be closed before terminating the nlm, otherwise }
|
{ to be closed before terminating the nlm, otherwise }
|
||||||
@ -469,6 +476,8 @@ begin
|
|||||||
ThreadSetPriority :=@SysThreadSetPriority;
|
ThreadSetPriority :=@SysThreadSetPriority;
|
||||||
ThreadGetPriority :=@SysThreadGetPriority;
|
ThreadGetPriority :=@SysThreadGetPriority;
|
||||||
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@SysSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@SysSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@SysInitCriticalSection;
|
InitCriticalSection :=@SysInitCriticalSection;
|
||||||
DoneCriticalSection :=@SysDoneCriticalSection;
|
DoneCriticalSection :=@SysDoneCriticalSection;
|
||||||
EnterCriticalSection :=@SysEnterCriticalSection;
|
EnterCriticalSection :=@SysEnterCriticalSection;
|
||||||
|
@ -221,6 +221,15 @@
|
|||||||
SysGetCurrentThreadId:=dword(pthread_self);
|
SysGetCurrentThreadId:=dword(pthread_self);
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
@ -364,6 +373,8 @@ begin
|
|||||||
ThreadSetPriority :=@SysThreadSetPriority;
|
ThreadSetPriority :=@SysThreadSetPriority;
|
||||||
ThreadGetPriority :=@SysThreadGetPriority;
|
ThreadGetPriority :=@SysThreadGetPriority;
|
||||||
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@SysSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@SysSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@SysInitCriticalSection;
|
InitCriticalSection :=@SysInitCriticalSection;
|
||||||
DoneCriticalSection :=@SysDoneCriticalSection;
|
DoneCriticalSection :=@SysDoneCriticalSection;
|
||||||
EnterCriticalSection :=@SysEnterCriticalSection;
|
EnterCriticalSection :=@SysEnterCriticalSection;
|
||||||
|
@ -674,36 +674,20 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
{$ifdef THREADNAME_IS_ANSISTRING}
|
|
||||||
{ the platform implements the AnsiString variant and the UnicodeString variant
|
|
||||||
simply calls the AnsiString variant }
|
|
||||||
class procedure TThread.NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID);
|
class procedure TThread.NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID);
|
||||||
begin
|
begin
|
||||||
NameThreadForDebugging(AnsiString(aThreadName), aThreadID);
|
{$ifdef FPC_HAS_FEATURE_THREADING}
|
||||||
end;
|
SetThreadDebugName(aThreadID, aThreadName);
|
||||||
|
|
||||||
{$ifndef HAS_TTHREAD_NAMETHREADFORDEBUGGING}
|
|
||||||
class procedure TThread.NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID);
|
|
||||||
begin
|
|
||||||
{ empty }
|
|
||||||
end;
|
|
||||||
{$endif}
|
|
||||||
{$else}
|
|
||||||
{$ifndef HAS_TTHREAD_NAMETHREADFORDEBUGGING}
|
|
||||||
{ the platform implements the UnicodeString variant and the AnsiString variant
|
|
||||||
simply calls the UnicodeString variant }
|
|
||||||
class procedure TThread.NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID);
|
|
||||||
begin
|
|
||||||
{ empty }
|
|
||||||
end;
|
|
||||||
{$endif}
|
|
||||||
|
|
||||||
|
|
||||||
class procedure TThread.NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID);
|
|
||||||
begin
|
|
||||||
NameThreadForDebugging(UnicodeString(aThreadName), aThreadID);
|
|
||||||
end;
|
|
||||||
{$endif}
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
class procedure TThread.NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID);
|
||||||
|
begin
|
||||||
|
{$ifdef FPC_HAS_FEATURE_THREADING}
|
||||||
|
SetThreadDebugName(aThreadID, aThreadName);
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
class procedure TThread.Yield;
|
class procedure TThread.Yield;
|
||||||
|
@ -1793,13 +1793,7 @@ type
|
|||||||
destructor Destroy; override;
|
destructor Destroy; override;
|
||||||
{ Note: Once closures are supported aProc will be changed to TProc }
|
{ Note: Once closures are supported aProc will be changed to TProc }
|
||||||
class function CreateAnonymousThread(aProc: TProcedure): TThread; static;
|
class function CreateAnonymousThread(aProc: TProcedure): TThread; static;
|
||||||
{ Use HAS_TTHREAD_NAMETHREADFORDEBUGGING to implement a platform specific
|
class procedure NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
|
||||||
variant of the UnicodeString method. The AnsiString method calls the
|
|
||||||
UnicodeString method. If your platform's API only supports AnsiString you
|
|
||||||
can additionally define THREADNAME_IS_ANSISTRING to swap the logic. Then
|
|
||||||
the UnicodeString variant will call the AnsiString variant which can be
|
|
||||||
implemented for a specific platform }
|
|
||||||
class procedure NameThreadForDebugging(aThreadName: UnicodeString; aThreadID: TThreadID = TThreadID(-1)); static;
|
|
||||||
class procedure NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
|
class procedure NameThreadForDebugging(aThreadName: AnsiString; aThreadID: TThreadID = TThreadID(-1)); static; inline;
|
||||||
class procedure SetReturnValue(aValue: Integer); static;
|
class procedure SetReturnValue(aValue: Integer); static;
|
||||||
class function CheckTerminated: Boolean; static;
|
class function CheckTerminated: Boolean; static;
|
||||||
|
@ -659,6 +659,17 @@ begin
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
@ -936,12 +947,14 @@ begin
|
|||||||
SuspendThread :=@SysSuspendThread;
|
SuspendThread :=@SysSuspendThread;
|
||||||
ResumeThread :=@SysResumeThread;
|
ResumeThread :=@SysResumeThread;
|
||||||
KillThread :=@SysKillThread;
|
KillThread :=@SysKillThread;
|
||||||
CloseThread :=@SysCloseThread;
|
CloseThread :=@SysCloseThread;
|
||||||
ThreadSwitch :=@SysThreadSwitch;
|
ThreadSwitch :=@SysThreadSwitch;
|
||||||
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
||||||
ThreadSetPriority :=@SysThreadSetPriority;
|
ThreadSetPriority :=@SysThreadSetPriority;
|
||||||
ThreadGetPriority :=@SysThreadGetPriority;
|
ThreadGetPriority :=@SysThreadGetPriority;
|
||||||
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@SysSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@SysSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@SysInitCriticalSection;
|
InitCriticalSection :=@SysInitCriticalSection;
|
||||||
DoneCriticalSection :=@SysDoneCriticalSection;
|
DoneCriticalSection :=@SysDoneCriticalSection;
|
||||||
EnterCriticalSection :=@SysEnterCriticalSection;
|
EnterCriticalSection :=@SysEnterCriticalSection;
|
||||||
|
@ -481,6 +481,51 @@ Type PINTRTLEvent = ^TINTRTLEvent;
|
|||||||
end;
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure CSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
{$if defined(Linux) or defined(Android)}
|
||||||
|
var
|
||||||
|
CuttedName: AnsiString;
|
||||||
|
{$endif}
|
||||||
|
begin
|
||||||
|
{$if defined(Linux) or defined(Android)}
|
||||||
|
if ThreadName = '' then
|
||||||
|
Exit;
|
||||||
|
{$ifdef dynpthreads}
|
||||||
|
if Assigned(pthread_setname_np) then
|
||||||
|
{$endif dynpthreads}
|
||||||
|
begin
|
||||||
|
// length restricted to 16 characters including terminating null byte
|
||||||
|
CuttedName:=Copy(ThreadName, 1, 15);
|
||||||
|
if threadHandle=TThreadID(-1) then
|
||||||
|
begin
|
||||||
|
pthread_setname_np(pthread_self(), @CuttedName[1]);
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
pthread_setname_np(pthread_t(threadHandle), @CuttedName[1]);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$else}
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
|
procedure CSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$if defined(Linux) or defined(Android)}
|
||||||
|
{$ifdef dynpthreads}
|
||||||
|
if Assigned(pthread_setname_np) then
|
||||||
|
{$endif dynpthreads}
|
||||||
|
begin
|
||||||
|
CSetThreadDebugNameA(threadHandle, AnsiString(ThreadName));
|
||||||
|
end;
|
||||||
|
{$else}
|
||||||
|
{$Warning SetThreadDebugName needs to be implemented}
|
||||||
|
{$endif}
|
||||||
|
end;
|
||||||
|
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -938,6 +983,8 @@ begin
|
|||||||
ThreadSetPriority :=@CThreadSetPriority;
|
ThreadSetPriority :=@CThreadSetPriority;
|
||||||
ThreadGetPriority :=@CThreadGetPriority;
|
ThreadGetPriority :=@CThreadGetPriority;
|
||||||
GetCurrentThreadId :=@CGetCurrentThreadId;
|
GetCurrentThreadId :=@CGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@CSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@CSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@CInitCriticalSection;
|
InitCriticalSection :=@CInitCriticalSection;
|
||||||
DoneCriticalSection :=@CDoneCriticalSection;
|
DoneCriticalSection :=@CDoneCriticalSection;
|
||||||
EnterCriticalSection :=@CEnterCriticalSection;
|
EnterCriticalSection :=@CEnterCriticalSection;
|
||||||
|
@ -231,6 +231,9 @@ type
|
|||||||
procedure SetLastError(dwErrCode : DWORD);
|
procedure SetLastError(dwErrCode : DWORD);
|
||||||
{$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'SetLastError';
|
{$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'SetLastError';
|
||||||
|
|
||||||
|
procedure RaiseException(dwExceptionCode: DWORD; dwExceptionFlags: DWORD; dwArgCount: DWORD; lpArguments: Pointer);
|
||||||
|
{$ifdef wince}cdecl{$else}stdcall{$endif}; external KernelDLL name 'RaiseException';
|
||||||
|
|
||||||
{ time and date functions }
|
{ time and date functions }
|
||||||
function GetTickCount : DWORD;
|
function GetTickCount : DWORD;
|
||||||
{$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetTickCount';
|
{$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetTickCount';
|
||||||
|
@ -52,6 +52,13 @@ function WaitForSingleObject (hHandle : THandle;Milliseconds: dword): dword; {$
|
|||||||
function WinThreadSetPriority (threadHandle : THandle; Prio: longint): boolean; {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'SetThreadPriority';
|
function WinThreadSetPriority (threadHandle : THandle; Prio: longint): boolean; {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'SetThreadPriority';
|
||||||
function WinThreadGetPriority (threadHandle : THandle): LongInt; {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetThreadPriority';
|
function WinThreadGetPriority (threadHandle : THandle): LongInt; {$ifdef wince}cdecl{$else}stdcall{$endif};external KernelDLL name 'GetThreadPriority';
|
||||||
{$ifndef WINCE}
|
{$ifndef WINCE}
|
||||||
|
function WinGetCurrentThread: THandle; stdcall; external KernelDLL name 'GetCurrentThread';
|
||||||
|
function WinOpenThread(dwDesiredAccess: DWord; bInheritHandle: Boolean; dwThreadId: DWord): THandle; stdcall; external KernelDLL name 'OpenThread';
|
||||||
|
function WinIsDebuggerPresent: Boolean; stdcall; external KernelDLL name 'IsDebuggerPresent';
|
||||||
|
type
|
||||||
|
TSetThreadDescription = function(threadHandle: THandle; lpThreadDescription: PWideChar): HResult; stdcall;
|
||||||
|
var
|
||||||
|
WinSetThreadDescription: TSetThreadDescription;
|
||||||
function CreateEvent(lpEventAttributes:pointer;bManualReset:longbool;bInitialState:longbool;lpName:pchar): THandle; stdcall; external KernelDLL name 'CreateEventA';
|
function CreateEvent(lpEventAttributes:pointer;bManualReset:longbool;bInitialState:longbool;lpName:pchar): THandle; stdcall; external KernelDLL name 'CreateEventA';
|
||||||
function ResetEvent(hEvent:THandle):LONGBOOL; stdcall; external KernelDLL name 'ResetEvent';
|
function ResetEvent(hEvent:THandle):LONGBOOL; stdcall; external KernelDLL name 'ResetEvent';
|
||||||
function SetEvent(hEvent:THandle):LONGBOOL; stdcall; external KernelDLL name 'SetEvent';
|
function SetEvent(hEvent:THandle):LONGBOOL; stdcall; external KernelDLL name 'SetEvent';
|
||||||
@ -338,6 +345,98 @@ var
|
|||||||
SysGetCurrentThreadId:=Win32GetCurrentThreadId;
|
SysGetCurrentThreadId:=Win32GetCurrentThreadId;
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
{$ifndef WINCE}
|
||||||
|
{ following method is supported on older Windows versions AND currently only supported method by GDB }
|
||||||
|
procedure RaiseMSVCExceptionMethod(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
const
|
||||||
|
MS_VC_EXCEPTION: DWord = $406D1388;
|
||||||
|
type
|
||||||
|
THREADNAME_INFO = record
|
||||||
|
dwType: DWord; // Must be 0x1000.
|
||||||
|
szName: PAnsiChar; // Pointer to name (in user addr space).
|
||||||
|
dwThreadID: DWord; // Thread ID (-1=caller thread).
|
||||||
|
dwFlags: DWord; // Reserved for future use, must be zero.
|
||||||
|
end;
|
||||||
|
var
|
||||||
|
thrdinfo: THREADNAME_INFO;
|
||||||
|
begin
|
||||||
|
thrdinfo.dwType:=$1000;
|
||||||
|
thrdinfo.szName:=@ThreadName[1];
|
||||||
|
thrdinfo.dwThreadID:=threadHandle;
|
||||||
|
thrdinfo.dwFlags:=0;
|
||||||
|
try
|
||||||
|
RaiseException(MS_VC_EXCEPTION, 0, SizeOf(thrdinfo) div SizeOf(DWord), @thrdinfo);
|
||||||
|
except
|
||||||
|
{do nothing}
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
|
||||||
|
{ following method needs at least Windows 10 version 1607 or Windows Server 2016 }
|
||||||
|
procedure SetThreadDescriptionMethod(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
var
|
||||||
|
thrdhandle: THandle;
|
||||||
|
ClosingNeeded: Boolean;
|
||||||
|
begin
|
||||||
|
if threadHandle=TThreadID(-1) then
|
||||||
|
begin
|
||||||
|
thrdhandle:=WinGetCurrentThread;
|
||||||
|
ClosingNeeded:=False;
|
||||||
|
end
|
||||||
|
else
|
||||||
|
begin
|
||||||
|
thrdhandle:=WinOpenThread($0400, False, threadHandle);
|
||||||
|
ClosingNeeded:=True;
|
||||||
|
end;
|
||||||
|
|
||||||
|
WinSetThreadDescription(thrdhandle, @ThreadName[1]);
|
||||||
|
|
||||||
|
if ClosingNeeded then
|
||||||
|
begin
|
||||||
|
CloseHandle(thrdhandle);
|
||||||
|
end;
|
||||||
|
end;
|
||||||
|
{$endif WINCE}
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameA(threadHandle: TThreadID; const ThreadName: AnsiString);
|
||||||
|
begin
|
||||||
|
{$ifndef WINCE}
|
||||||
|
if ThreadName = '' then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
if WinIsDebuggerPresent then
|
||||||
|
begin
|
||||||
|
RaiseMSVCExceptionMethod(threadHandle, ThreadName);
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Assigned(WinSetThreadDescription) then
|
||||||
|
begin
|
||||||
|
SetThreadDescriptionMethod(threadHandle, UnicodeString(ThreadName));
|
||||||
|
end;
|
||||||
|
{$else WINCE}
|
||||||
|
{$Warning SetThreadDebugNameA needs to be implemented}
|
||||||
|
{$endif WINCE}
|
||||||
|
end;
|
||||||
|
|
||||||
|
procedure SysSetThreadDebugNameU(threadHandle: TThreadID; const ThreadName: UnicodeString);
|
||||||
|
begin
|
||||||
|
{$ifndef WINCE}
|
||||||
|
if ThreadName = '' then
|
||||||
|
Exit;
|
||||||
|
|
||||||
|
if WinIsDebuggerPresent then
|
||||||
|
begin
|
||||||
|
RaiseMSVCExceptionMethod(threadHandle, AnsiString(ThreadName));
|
||||||
|
end;
|
||||||
|
|
||||||
|
if Assigned(WinSetThreadDescription) then
|
||||||
|
begin
|
||||||
|
SetThreadDescriptionMethod(threadHandle, ThreadName);
|
||||||
|
end;
|
||||||
|
{$else WINCE}
|
||||||
|
{$Warning SetThreadDebugNameU needs to be implemented}
|
||||||
|
{$endif WINCE}
|
||||||
|
end;
|
||||||
|
|
||||||
{*****************************************************************************
|
{*****************************************************************************
|
||||||
Delphi/Win32 compatibility
|
Delphi/Win32 compatibility
|
||||||
*****************************************************************************}
|
*****************************************************************************}
|
||||||
@ -497,10 +596,10 @@ Var
|
|||||||
WinThreadManager : TThreadManager;
|
WinThreadManager : TThreadManager;
|
||||||
|
|
||||||
Procedure InitSystemThreads;public name '_FPC_InitSystemThreads';
|
Procedure InitSystemThreads;public name '_FPC_InitSystemThreads';
|
||||||
{$IFDEF SUPPORT_WIN95}
|
{$ifndef WINCE}
|
||||||
var
|
var
|
||||||
KernelHandle : THandle;
|
KernelHandle : THandle;
|
||||||
{$ENDIF SUPPORT_WIN95}
|
{$endif}
|
||||||
begin
|
begin
|
||||||
With WinThreadManager do
|
With WinThreadManager do
|
||||||
begin
|
begin
|
||||||
@ -512,11 +611,13 @@ begin
|
|||||||
ResumeThread :=@SysResumeThread;
|
ResumeThread :=@SysResumeThread;
|
||||||
KillThread :=@SysKillThread;
|
KillThread :=@SysKillThread;
|
||||||
ThreadSwitch :=@SysThreadSwitch;
|
ThreadSwitch :=@SysThreadSwitch;
|
||||||
CloseThread :=@SysCloseThread;
|
CloseThread :=@SysCloseThread;
|
||||||
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
WaitForThreadTerminate :=@SysWaitForThreadTerminate;
|
||||||
ThreadSetPriority :=@SysThreadSetPriority;
|
ThreadSetPriority :=@SysThreadSetPriority;
|
||||||
ThreadGetPriority :=@SysThreadGetPriority;
|
ThreadGetPriority :=@SysThreadGetPriority;
|
||||||
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
GetCurrentThreadId :=@SysGetCurrentThreadId;
|
||||||
|
SetThreadDebugNameA :=@SysSetThreadDebugNameA;
|
||||||
|
SetThreadDebugNameU :=@SysSetThreadDebugNameU;
|
||||||
InitCriticalSection :=@SysInitCriticalSection;
|
InitCriticalSection :=@SysInitCriticalSection;
|
||||||
DoneCriticalSection :=@SysDoneCriticalSection;
|
DoneCriticalSection :=@SysDoneCriticalSection;
|
||||||
EnterCriticalSection :=@SysEnterCriticalSection;
|
EnterCriticalSection :=@SysEnterCriticalSection;
|
||||||
@ -544,13 +645,24 @@ begin
|
|||||||
if IsLibrary then
|
if IsLibrary then
|
||||||
{$endif}
|
{$endif}
|
||||||
SysInitTLS;
|
SysInitTLS;
|
||||||
|
|
||||||
|
{$ifndef WINCE}
|
||||||
|
KernelHandle:=GetModuleHandle(KernelDLL);
|
||||||
|
{$endif}
|
||||||
|
|
||||||
{$IFDEF SUPPORT_WIN95}
|
{$IFDEF SUPPORT_WIN95}
|
||||||
{ Try to find TryEnterCriticalSection function }
|
{ Try to find TryEnterCriticalSection function }
|
||||||
KernelHandle:=GetModuleHandle(KernelDLL);
|
|
||||||
if KernelHandle<>0 then
|
if KernelHandle<>0 then
|
||||||
WinTryEnterCriticalSection:=TTryEnterCriticalSection(WinGetProcAddress(KernelHandle,'TryEnterCriticalSection'));
|
WinTryEnterCriticalSection:=TTryEnterCriticalSection(WinGetProcAddress(KernelHandle,'TryEnterCriticalSection'));
|
||||||
if not assigned(WinTryEnterCriticalSection) then
|
if not assigned(WinTryEnterCriticalSection) then
|
||||||
WinTryEnterCriticalSection:=@Win95TryEnterCriticalSection;
|
WinTryEnterCriticalSection:=@Win95TryEnterCriticalSection;
|
||||||
{$ENDIF SUPPORT_WIN95}
|
{$ENDIF SUPPORT_WIN95}
|
||||||
|
|
||||||
|
{$ifndef WINCE}
|
||||||
|
if KernelHandle<>0 then
|
||||||
|
begin
|
||||||
|
WinSetThreadDescription:=TSetThreadDescription(WinGetProcAddress(KernelHandle, 'SetThreadDescription'));
|
||||||
|
end;
|
||||||
|
{$endif WINCE}
|
||||||
end;
|
end;
|
||||||
|
|
||||||
|
@ -130,14 +130,6 @@ type
|
|||||||
TExceptClsProc=function(code: Longint): Pointer; { ExceptClass }
|
TExceptClsProc=function(code: Longint): Pointer; { ExceptClass }
|
||||||
|
|
||||||
|
|
||||||
procedure RaiseException(
|
|
||||||
dwExceptionCode: DWORD;
|
|
||||||
dwExceptionFlags: DWORD;
|
|
||||||
dwArgCount: DWORD;
|
|
||||||
lpArguments: Pointer); // msdn: *ULONG_PTR
|
|
||||||
stdcall; external 'kernel32.dll' name 'RaiseException';
|
|
||||||
|
|
||||||
|
|
||||||
function RunErrorCode(const rec: TExceptionRecord): longint;
|
function RunErrorCode(const rec: TExceptionRecord): longint;
|
||||||
begin
|
begin
|
||||||
{ negative result means 'FPU reset required' }
|
{ negative result means 'FPU reset required' }
|
||||||
|
Loading…
Reference in New Issue
Block a user