* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows

Check work: ask Neli.
This commit is contained in:
marco 2004-12-22 21:29:24 +00:00
parent 1da9e24cee
commit 0db4315ea9
7 changed files with 195 additions and 11 deletions

View File

@ -32,6 +32,8 @@ CONST PTHREAD_EXPLICIT_SCHED = 0;
__destr_func_t = procedure (p :pointer);cdecl; __destr_func_t = procedure (p :pointer);cdecl;
__startroutine_t = function (p :pointer):pointer;cdecl; __startroutine_t = function (p :pointer):pointer;cdecl;
ppthread_mutexattr_t = ^pthread_mutexattr_t; ppthread_mutexattr_t = ^pthread_mutexattr_t;
ppthread_cond_t = ^pthread_cond_t;
ppthread_condattr_t = ^pthread_condattr_t;
sem_t = cint; sem_t = cint;
psem_t = ^sem_t; psem_t = ^sem_t;
@ -55,6 +57,10 @@ function pthread_mutex_unlock (p:ppthread_mutexattr_t):cint; cdecl;external 'c
function pthread_cancel(_para1:pthread_t):cint;cdecl;external 'c'; function pthread_cancel(_para1:pthread_t):cint;cdecl;external 'c';
function pthread_detach(_para1:pthread_t):cint;cdecl;external 'c'; function pthread_detach(_para1:pthread_t):cint;cdecl;external 'c';
function pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external 'c'; function pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external 'c';
function pthread_cond_destroy(_para1:Ppthread_cond_t):cint;cdecl;external 'c' name 'pthread_cond_destroy';
function pthread_cond_init(_para1:Ppthread_cond_t;_para2:Ppthread_condattr_t):cint;cdecl;external 'c' name 'pthread_cond_init';
function pthread_cond_signal(_para1:Ppthread_cond_t):cint;cdecl;external 'c' name 'pthread_cond_signal';
function pthread_cond_wait(_para1:Ppthread_cond_t;_para2:Ppthread_mutex_t):cint;cdecl;external 'c' name 'pthread_cond_wait';
function sem_init(__sem:Psem_t; __pshared:cint;__value:cuint):cint;cdecl; external 'c' name 'sem_init'; function sem_init(__sem:Psem_t; __pshared:cint;__value:cuint):cint;cdecl; external 'c' name 'sem_init';
function sem_destroy(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_destroy'; function sem_destroy(__sem:Psem_t):cint;cdecl;external 'c' name 'sem_destroy';
@ -72,7 +78,11 @@ function pthread_mutexattr_settype(_para1:Ppthread_mutexattr_t; _para2:cint):cin
{ {
$Log$ $Log$
Revision 1.5 2004-09-09 20:29:06 jonas Revision 1.6 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.5 2004/09/09 20:29:06 jonas
* fixed definition of pthread_mutex_t for non-linux targets (and for * fixed definition of pthread_mutex_t for non-linux targets (and for
linux as well, actually). linux as well, actually).
* base libpthread definitions are now in ptypes.inc, included in unixtype * base libpthread definitions are now in ptypes.inc, included in unixtype

View File

@ -232,11 +232,11 @@ UNIXINC=$(RTL)/unix
UNITPREFIX=rtl UNITPREFIX=rtl
ifeq ($(findstring 1.0.,$(FPC_VERSION)),) ifeq ($(findstring 1.0.,$(FPC_VERSION)),)
SYSTEMUNIT=system SYSTEMUNIT=system
override FPCOPT+=-dNOMOUSE override FPCOPT+=-dNOGPM
loaders+=gprt0 loaders+=gprt0
else else
SYSTEMUNIT=sysbsd SYSTEMUNIT=sysbsd
override FPCOPT+=-dUNIX -dNOMOUSE override FPCOPT+=-dUNIX -dNOGPM
endif endif
ifdef RELEASE ifdef RELEASE
override FPCOPT+=-Ur override FPCOPT+=-Ur

View File

@ -29,6 +29,9 @@ CONST PTHREAD_EXPLICIT_SCHED = 0;
ppthread_key_t = ^pthread_key_t; ppthread_key_t = ^pthread_key_t;
ppthread_mutex_t= ^pthread_mutex_t; ppthread_mutex_t= ^pthread_mutex_t;
ppthread_attr_t = ^pthread_attr_t; ppthread_attr_t = ^pthread_attr_t;
ppthread_cond_t = ^pthread_cond_t;
ppthread_condattr_t = ^pthread_condattr_t;
__destr_func_t = procedure (p :pointer);cdecl; __destr_func_t = procedure (p :pointer);cdecl;
__startroutine_t= function (p :pointer):pointer;cdecl; __startroutine_t= function (p :pointer):pointer;cdecl;
ppthread_mutexattr_t = ^pthread_mutexattr_t; ppthread_mutexattr_t = ^pthread_mutexattr_t;
@ -56,6 +59,10 @@ function pthread_mutex_unlock (p:ppthread_mutex_attr_t):cint; cdecl;external;
function pthread_cancel(_para1:pthread_t):cint;cdecl;external; function pthread_cancel(_para1:pthread_t):cint;cdecl;external;
function pthread_detach(_para1:pthread_t):cint;cdecl;external; function pthread_detach(_para1:pthread_t):cint;cdecl;external;
function pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external; function pthread_join(_para1:pthread_t; _para2:Ppointer):cint;cdecl;external;
function pthread_cond_destroy(_para1:Ppthread_cond_t):cint;cdecl;external;
function pthread_cond_init(_para1:Ppthread_cond_t;_para2:Ppthread_condattr_t):cint;cdecl;external;
function pthread_cond_signal(_para1:Ppthread_cond_t):cint;cdecl;external;
function pthread_cond_wait(_para1:Ppthread_cond_t;_para2:Ppthread_mutex_t):cint;cdecl;external;
function sem_init(__sem:Psem_t; __pshared:cint;__value:dword):cint;cdecl; external; function sem_init(__sem:Psem_t; __pshared:cint;__value:dword):cint;cdecl; external;
function sem_destroy(__sem:Psem_t):cint;cdecl;external ; function sem_destroy(__sem:Psem_t):cint;cdecl;external ;
@ -74,7 +81,11 @@ function pthread_mutexattr_settype(_para1:Ppthread_mutexattr_t; _para2:cint):cin
{ {
$Log$ $Log$
Revision 1.5 2004-09-10 15:15:45 marco Revision 1.6 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.5 2004/09/10 15:15:45 marco
* small glitch fixes * small glitch fixes
Revision 1.4 2004/09/09 20:29:06 jonas Revision 1.4 2004/09/09 20:29:06 jonas

View File

@ -229,6 +229,31 @@ begin
result:=currenttm.basiceventWaitFor(Timeout,state); result:=currenttm.basiceventWaitFor(Timeout,state);
end; end;
function RTLEventCreate :PRTLEvent;
begin
result:=currenttm.rtleventcreate;
end;
procedure RTLeventdestroy(state:pRTLEvent);
begin
currenttm.rtleventdestroy(state);
end;
procedure RTLeventSetEvent(state:pRTLEvent);
begin
currenttm.rtleventsetEvent(state);
end;
procedure RTLeventWaitFor(state:pRTLEvent);
begin
currenttm.rtleventWaitFor(state);
end;
{ --------------------------------------------------------------------- { ---------------------------------------------------------------------
ThreadManager which gives run-time error. Use if no thread support. ThreadManager which gives run-time error. Use if no thread support.
@ -354,6 +379,31 @@ begin
NoThreadError; NoThreadError;
end; end;
function NORTLEventCreate :PRTLEvent;
begin
NoThreadError;
end;
procedure NORTLeventdestroy(state:pRTLEvent);
begin
NoThreadError;
end;
procedure NORTLeventSetEvent(state:pRTLEvent);
begin
NoThreadError;
end;
procedure NORTLeventWaitFor(state:pRTLEvent);
begin
NoThreadError;
end;
Var Var
NoThreadManager : TThreadManager; NoThreadManager : TThreadManager;
@ -387,6 +437,10 @@ begin
basiceventResetEvent :=@NobasiceventResetEvent; basiceventResetEvent :=@NobasiceventResetEvent;
basiceventSetEvent :=@NobasiceventSetEvent; basiceventSetEvent :=@NobasiceventSetEvent;
basiceventWaitFor :=@NobasiceventWaitFor; basiceventWaitFor :=@NobasiceventWaitFor;
rtlEventCreate :=@NortlEventCreate;
rtleventdestroy :=@Nortleventdestroy;
rtleventSetEvent :=@NortleventSetEvent;
rtleventWaitFor :=@NortleventWaitFor;
end; end;
SetThreadManager(NoThreadManager); SetThreadManager(NoThreadManager);
@ -395,7 +449,11 @@ end;
{ {
$Log$ $Log$
Revision 1.12 2004-09-19 18:55:30 armin Revision 1.13 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.12 2004/09/19 18:55:30 armin
* added define DISABLE_NO_THREAD_MANAGER to avoid warnings if thread manager is always present * added define DISABLE_NO_THREAD_MANAGER to avoid warnings if thread manager is always present
Revision 1.11 2004/05/23 20:26:20 marco Revision 1.11 2004/05/23 20:26:20 marco

View File

@ -21,6 +21,7 @@ const
type type
PEventState = pointer; PEventState = pointer;
PRTLEvent = pointer; // Windows=thandle, other=pointer to record.
TThreadFunc = function(parameter : pointer) : ptrint; TThreadFunc = function(parameter : pointer) : ptrint;
// Function prototypes for TThreadManager Record. // Function prototypes for TThreadManager Record.
@ -41,6 +42,8 @@ type
TBasicEventHandler = procedure(state:peventstate); TBasicEventHandler = procedure(state:peventstate);
TBasicEventWaitForHandler = function (timeout:cardinal;state:peventstate):longint; TBasicEventWaitForHandler = function (timeout:cardinal;state:peventstate):longint;
TBasicEventCreateHandler = function (EventAttributes :Pointer; AManualReset,InitialState : Boolean;const Name:ansistring):pEventState; TBasicEventCreateHandler = function (EventAttributes :Pointer; AManualReset,InitialState : Boolean;const Name:ansistring):pEventState;
TRTLEventHandler = procedure(AEvent:PRTLEvent);
TRTLCreateEventHandler = function:PRTLEvent;
// TThreadManager interface. // TThreadManager interface.
TThreadManager = Record TThreadManager = Record
@ -64,11 +67,15 @@ type
RelocateThreadVar : TRelocateThreadVarHandler; RelocateThreadVar : TRelocateThreadVarHandler;
AllocateThreadVars : TAllocateThreadVarsHandler; AllocateThreadVars : TAllocateThreadVarsHandler;
ReleaseThreadVars : TReleaseThreadVarsHandler; ReleaseThreadVars : TReleaseThreadVarsHandler;
BasicEventCreate : TBasicEventCreateHandler; BasicEventCreate : TBasicEventCreateHandler; // left in for a while.
BasicEventDestroy : TBasicEventHandler; BasicEventDestroy : TBasicEventHandler; // we might need BasicEvent
BasicEventResetEvent : TBasicEventHandler; BasicEventResetEvent : TBasicEventHandler; // for a real TEvent
BasicEventSetEvent : TBasicEventHandler; BasicEventSetEvent : TBasicEventHandler;
BasiceventWaitFOr : TBasicEventWaitForHandler; BasiceventWaitFOr : TBasicEventWaitForHandler;
RTLEventCreate : TRTLCreateEventHandler;
RTLEventDestroy : TRTLEventHandler;
RTLEventSetEvent : TRTLEventHandler;
RTLeventWaitFOr : TRTLEventHandler;
end; end;
{***************************************************************************** {*****************************************************************************
@ -143,9 +150,18 @@ procedure basiceventResetEvent(state:peventstate);
procedure basiceventSetEvent(state:peventstate); procedure basiceventSetEvent(state:peventstate);
function basiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint; function basiceventWaitFor(Timeout : Cardinal;state:peventstate) : longint;
function RTLEventCreate :PRTLEvent;
procedure RTLeventdestroy(state:pRTLEvent);
procedure RTLeventSetEvent(state:pRTLEvent);
procedure RTLeventWaitFor(state:pRTLEvent);
{ {
$Log$ $Log$
Revision 1.20 2004-12-12 14:30:27 peter Revision 1.21 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.20 2004/12/12 14:30:27 peter
* x86_64 updates * x86_64 updates
Revision 1.19 2004/09/19 18:55:30 armin Revision 1.19 2004/09/19 18:55:30 armin

View File

@ -52,6 +52,12 @@ Uses
{ Include OS specific parts. } { Include OS specific parts. }
{$i pthread.inc} {$i pthread.inc}
Type PINTRTLEvent = ^TINTRTLEvent;
TINTRTLEvent = record
condvar: pthread_cond_t;
mutex: pthread_mutex_t;
end;
{***************************************************************************** {*****************************************************************************
Threadvar support Threadvar support
*****************************************************************************} *****************************************************************************}
@ -516,6 +522,48 @@ begin
end; end;
end; end;
function intRTLEventCreate: PRTLEvent;
var p:pintrtlevent;
begin
new(p);
pthread_cond_init(@p^.condvar, nil);
pthread_mutex_init(@p^.mutex, nil);
result:=PRTLEVENT(p);
end;
procedure intRTLEventDestroy(AEvent: PRTLEvent);
var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_cond_destroy(@p^.condvar);
pthread_mutex_destroy(@p^.mutex);
dispose(p);
end;
procedure intRTLEventSetEvent(AEvent: PRTLEvent);
var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_mutex_lock(@p^.mutex);
pthread_cond_signal(@p^.condvar);
pthread_mutex_unlock(@p^.mutex);
end;
procedure intRTLEventWaitFor(AEvent: PRTLEvent);
var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_mutex_lock(@p^.mutex);
pthread_cond_wait(@p^.condvar, @p^.mutex);
pthread_mutex_unlock(@p^.mutex);
end;
Var Var
CThreadManager : TThreadManager; CThreadManager : TThreadManager;
@ -551,6 +599,10 @@ begin
BasicEventResetEvent :=@intBasicEventResetEvent; BasicEventResetEvent :=@intBasicEventResetEvent;
BasicEventSetEvent :=@intBasicEventSetEvent; BasicEventSetEvent :=@intBasicEventSetEvent;
BasiceventWaitFor :=@intBasiceventWaitFor; BasiceventWaitFor :=@intBasiceventWaitFor;
rtlEventCreate :=@intrtlEventCreate;
rtlEventDestroy :=@intrtlEventDestroy;
rtlEventSetEvent :=@intrtlEventSetEvent;
rtleventWaitFor :=@intrtleventWaitFor;
end; end;
SetThreadManager(CThreadManager); SetThreadManager(CThreadManager);
InitHeapMutexes; InitHeapMutexes;
@ -561,7 +613,11 @@ initialization
end. end.
{ {
$Log$ $Log$
Revision 1.14 2004-12-12 14:30:27 peter Revision 1.15 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.14 2004/12/12 14:30:27 peter
* x86_64 updates * x86_64 updates
Revision 1.13 2004/10/14 17:39:33 florian Revision 1.13 2004/10/14 17:39:33 florian

View File

@ -88,6 +88,7 @@ function CreateEvent(lpEventAttributes:pointer;bManualReset:longbool;bInitialSt
function CloseHandle(hObject:CARDINAL):LONGBOOL; external 'kernel32' name 'CloseHandle'; function CloseHandle(hObject:CARDINAL):LONGBOOL; external 'kernel32' name 'CloseHandle';
function ResetEvent(hEvent:CARDINAL):LONGBOOL; external 'kernel32' name 'ResetEvent'; function ResetEvent(hEvent:CARDINAL):LONGBOOL; external 'kernel32' name 'ResetEvent';
function SetEvent(hEvent:CARDINAL):LONGBOOL; external 'kernel32' name 'SetEvent'; function SetEvent(hEvent:CARDINAL):LONGBOOL; external 'kernel32' name 'SetEvent';
function PulseEvent(hEvent:THANDLE):CARDINAL {WINBOOL}; external 'kernel32' name 'PulseEvent';
CONST CONST
WAIT_OBJECT_0 = 0; WAIT_OBJECT_0 = 0;
@ -419,6 +420,30 @@ begin
end; end;
end; end;
function intRTLEventCreate: PRTLEvent;
begin
Result := PRTLEVENT(CreateEvent(nil, false, false, nil));
end;
procedure intRTLEventDestroy(AEvent: PRTLEvent);
begin
CloseHandle(THANDLE(AEvent));
end;
procedure intRTLEventSetEvent(AEvent: PRTLEvent);
begin
PulseEvent(THANDLE(AEvent));
end;
CONST INFINITE=-1;
procedure intRTLEventWaitFor(AEvent: PRTLEvent);
begin
WaitForSingleObject(THANDLE(AEvent), INFINITE);
end;
Var Var
WinThreadManager : TThreadManager; WinThreadManager : TThreadManager;
@ -454,6 +479,10 @@ begin
BasicEventResetEvent :=@intBasicEventResetEvent; BasicEventResetEvent :=@intBasicEventResetEvent;
BasicEventSetEvent :=@intBasicEventSetEvent; BasicEventSetEvent :=@intBasicEventSetEvent;
BasiceventWaitFor :=@intBasiceventWaitFor; BasiceventWaitFor :=@intBasiceventWaitFor;
RTLEventCreate :=@intRTLEventCreate;
RTLEventDestroy :=@intRTLEventDestroy;
RTLEventSetEvent :=@intRTLEventSetEvent;
RTLeventWaitFor :=@intRTLeventWaitFor;
end; end;
SetThreadManager(WinThreadManager); SetThreadManager(WinThreadManager);
InitHeapMutexes; InitHeapMutexes;
@ -465,7 +494,11 @@ end.
{ {
$Log$ $Log$
Revision 1.11 2004-05-23 15:30:13 marco Revision 1.12 2004-12-22 21:29:24 marco
* rtlevent kraam. Checked (compile): Linux, FreeBSD, Darwin, Windows
Check work: ask Neli.
Revision 1.11 2004/05/23 15:30:13 marco
* first try * first try
Revision 1.10 2004/01/21 14:15:42 florian Revision 1.10 2004/01/21 14:15:42 florian