Browse Source

* SimpleIPC, avoid stale server state files (Unix). Patch by Andrew, Mantis #21289

git-svn-id: trunk@20385 -
marco 13 years ago
parent
commit
99892a7e45
1 changed files with 20 additions and 1 deletions
  1. 20 1
      packages/fcl-process/src/unix/simpleipc.inc

+ 20 - 1
packages/fcl-process/src/unix/simpleipc.inc

@@ -155,8 +155,27 @@ begin
 end;
 end;
 
 
 function TPipeClientComm.ServerRunning: Boolean;
 function TPipeClientComm.ServerRunning: Boolean;
+var
+  fd: cint;
 begin
 begin
   Result:=FileExists(FFileName);
   Result:=FileExists(FFileName);
+  // it's possible to have a stale file that is not open for reading which will
+  // cause fpOpen to hang/block later when .Active is set to true while it
+  // wait's for the pipe to be opened on the other end
+  if Result then
+  begin
+    // O_WRONLY | O_NONBLOCK causes fpOpen to return -1 if the file is not open for reading
+    // so in fact the 'server' is not running
+    fd := FpOpen(FFileName, O_WRONLY or O_NONBLOCK);
+    if fd = -1 then
+    begin
+      Result := False;
+      // delete the named pipe since it's orphaned
+      FpUnlink(FFileName);
+    end
+    else
+      FpClose(fd);
+  end;
 end;
 end;
 
 
 
 
@@ -282,4 +301,4 @@ initialization
 Finalization
 Finalization
   IPCDone;  
   IPCDone;  
 end.
 end.
-{$endif}
+{$endif}