Browse Source

Fix invalid service termination bug in Windows

PascalCoin 4 years ago
parent
commit
e710fa98b7
1 changed files with 9 additions and 12 deletions
  1. 9 12
      src/core/upcdaemon.pas

+ 9 - 12
src/core/upcdaemon.pas

@@ -72,7 +72,6 @@ Type
   TPCDaemon = Class(TCustomDaemon)
   TPCDaemon = Class(TCustomDaemon)
   Private
   Private
     FThread : TPCDaemonThread;
     FThread : TPCDaemonThread;
-    Procedure ThreadStopped (Sender : TObject);
   public
   public
     Function Start : Boolean; override;
     Function Start : Boolean; override;
     Function Stop : Boolean; override;
     Function Stop : Boolean; override;
@@ -325,30 +324,26 @@ end;
 
 
 { TPCDaemon }
 { TPCDaemon }
 
 
-procedure TPCDaemon.ThreadStopped(Sender: TObject);
-begin
-  FreeAndNil(FThread);
-end;
-
 function TPCDaemon.Start: Boolean;
 function TPCDaemon.Start: Boolean;
 begin
 begin
   Result:=inherited Start;
   Result:=inherited Start;
   TLog.NewLog(ltinfo,ClassName,'Daemon Start '+BoolToStr(Result));
   TLog.NewLog(ltinfo,ClassName,'Daemon Start '+BoolToStr(Result));
   FThread:=TPCDaemonThread.Create;
   FThread:=TPCDaemonThread.Create;
-  FThread.OnTerminate:=@ThreadStopped;
-  FThread.FreeOnTerminate:=False;
+  FThread.FreeOnTerminate:=True;
   if (Application.HasOption('b','block')) then begin
   if (Application.HasOption('b','block')) then begin
     FThread.MaxBlockToRead:=StrToInt64Def(Application.GetOptionValue('b','block'),$FFFFFFFF);
     FThread.MaxBlockToRead:=StrToInt64Def(Application.GetOptionValue('b','block'),$FFFFFFFF);
     TLog.NewLog(ltinfo,ClassName,'Max block to read: '+IntToStr(FThread.MaxBlockToRead));
     TLog.NewLog(ltinfo,ClassName,'Max block to read: '+IntToStr(FThread.MaxBlockToRead));
   end;
   end;
-  FThread.Resume;
+  FThread.Start;
 end;
 end;
 
 
 function TPCDaemon.Stop: Boolean;
 function TPCDaemon.Stop: Boolean;
 begin
 begin
   Result:=inherited Stop;
   Result:=inherited Stop;
-  TLog.NewLog(ltinfo,ClassName,'Daemon Stop: '+BoolToStr(Result));
+  TLog.NewLog(ltinfo,ClassName,'Daemon Stop Start');
   FThread.Terminate;
   FThread.Terminate;
+  FThread.WaitFor;
+  TLog.NewLog(ltinfo,ClassName,'Daemon Stop Finished');
 end;
 end;
 
 
 function TPCDaemon.Pause: Boolean;
 function TPCDaemon.Pause: Boolean;
@@ -374,8 +369,10 @@ end;
 function TPCDaemon.ShutDown: Boolean;
 function TPCDaemon.ShutDown: Boolean;
 begin
 begin
   Result:=inherited ShutDown;
   Result:=inherited ShutDown;
-  TLog.NewLog(ltinfo,ClassName,'Daemon Shutdown: '+BoolToStr(Result));
+  TLog.NewLog(ltinfo,ClassName,'Daemon Shutdown Start');
   FThread.Terminate;
   FThread.Terminate;
+  FThread.WaitFor;
+  TLog.NewLog(ltinfo,ClassName,'Daemon Shutdown Finished');
 end;
 end;
 
 
 function TPCDaemon.Install: Boolean;
 function TPCDaemon.Install: Boolean;
@@ -408,11 +405,11 @@ end;
 
 
 procedure TPCDaemonMapper.DoOnDestroy;
 procedure TPCDaemonMapper.DoOnDestroy;
 begin
 begin
+  inherited DoOnDestroy;
   If Assigned(FLog) then begin
   If Assigned(FLog) then begin
     FLog.OnInThreadNewLog:=Nil;
     FLog.OnInThreadNewLog:=Nil;
     FreeAndNil(FLog);
     FreeAndNil(FLog);
   end;
   end;
-  inherited DoOnDestroy;
 end;
 end;
 
 
 end.
 end.