* patch from Lloyd B. Park to support persistent signals

for RTLEvent under unix

git-svn-id: trunk@5750 -
This commit is contained in:
Jonas Maebe 2006-12-30 17:28:10 +00:00
parent 6562e40a3e
commit bdfd3e5453

View File

@ -71,6 +71,7 @@ Type PINTRTLEvent = ^TINTRTLEvent;
TINTRTLEvent = record
condvar: pthread_cond_t;
mutex: pthread_mutex_t;
IsSet: boolean;
end;
{*****************************************************************************
@ -737,6 +738,7 @@ begin
new(p);
pthread_cond_init(@p^.condvar, nil);
pthread_mutex_init(@p^.mutex, nil);
p^.IsSet:= false;
result:=PRTLEVENT(p);
end;
@ -757,15 +759,21 @@ var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_mutex_lock(@p^.mutex);
p^.IsSet:= true;
pthread_cond_signal(@p^.condvar);
pthread_mutex_unlock(@p^.mutex);
end;
procedure intRTLEventResetEvent(AEvent: PRTLEvent);
begin
{ events before startwait are ignored unix }
end;
var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_mutex_lock(@p^.mutex);
p^.IsSet:= false;
pthread_mutex_unlock(@p^.mutex);
end;
procedure intRTLEventStartWait(AEvent: PRTLEvent);
@ -781,11 +789,11 @@ var p:pintrtlevent;
begin
p:=pintrtlevent(aevent);
pthread_cond_wait(@p^.condvar, @p^.mutex);
while not p^.IsSet do pthread_cond_wait(@p^.condvar, @p^.mutex);
p^.IsSet:=false;
pthread_mutex_unlock(@p^.mutex);
end;
procedure intRTLEventWaitForTimeout(AEvent: PRTLEvent;timeout : longint);
var
p : pintrtlevent;
@ -803,9 +811,14 @@ procedure intRTLEventWaitForTimeout(AEvent: PRTLEvent;timeout : longint);
inc(timespec.tv_sec);
dec(timespec.tv_nsec, 1000000000);
end;
errres:=pthread_cond_timedwait(@p^.condvar, @p^.mutex, @timespec);
if (errres=0) or (errres=ESysETIMEDOUT) then
pthread_mutex_unlock(@p^.mutex);
errres:=0;
while (not p^.IsSet) and
(errres <> ESysETIMEDOUT) do
begin
errres:=pthread_cond_timedwait(@p^.condvar, @p^.mutex, @timespec);
end;
p^.IsSet:= false;
pthread_mutex_unlock(@p^.mutex);
end;