Browse Source

* patch from Lloyd B. Park to support persistent signals
for RTLEvent under unix

git-svn-id: trunk@5750 -

Jonas Maebe 18 years ago
parent
commit
bdfd3e5453
1 changed files with 21 additions and 8 deletions
  1. 21 8
      rtl/unix/cthreads.pp

+ 21 - 8
rtl/unix/cthreads.pp

@@ -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;