lazbuild: fixed freeing views

git-svn-id: trunk@45393 -
This commit is contained in:
mattias 2014-06-08 08:52:18 +00:00
parent 49de54d716
commit b2dca3d504
2 changed files with 31 additions and 8 deletions

View File

@ -490,7 +490,7 @@ type
procedure LeaveCriticalSection; virtual; procedure LeaveCriticalSection; virtual;
property Thread: TThread read FThread write FThread; property Thread: TThread read FThread write FThread;
procedure ConsistencyCheck; virtual; procedure ConsistencyCheck; virtual;
procedure AutoFree; // free if not in use procedure AutoFree; // (only main thread) free if not in use
property Title: string read FTitle write SetTitle; property Title: string read FTitle write SetTitle;
property Hint: string read FHint write FHint; // this hint is shown in About dialog property Hint: string read FHint write FHint; // this hint is shown in About dialog
@ -605,6 +605,7 @@ type
procedure Clear; virtual; abstract; // terminate + free all tools procedure Clear; virtual; abstract; // terminate + free all tools
property Items[Index: integer]: TAbstractExternalTool read GetItems; default; property Items[Index: integer]: TAbstractExternalTool read GetItems; default;
function Add(Title: string): TAbstractExternalTool; virtual; abstract; function Add(Title: string): TAbstractExternalTool; virtual; abstract;
function IndexOf(Tool: TAbstractExternalTool): integer; virtual; abstract;
procedure ConsistencyCheck; virtual; procedure ConsistencyCheck; virtual;
procedure EnterCriticalSection; virtual; abstract; procedure EnterCriticalSection; virtual; abstract;
procedure LeaveCriticalSection; virtual; abstract; procedure LeaveCriticalSection; virtual; abstract;

View File

@ -35,7 +35,7 @@ unit ExtTools;
interface interface
uses uses
Classes, SysUtils, math, process, Pipes, contnrs, UTF8Process, Classes, SysUtils, math, process, Pipes, UTF8Process,
LazFileUtils, LazFileUtils,
// Codetools // Codetools
FileProcs, CodeToolsStructs, FileProcs, CodeToolsStructs,
@ -87,7 +87,7 @@ type
TLazExtToolConsole = class(TComponent) TLazExtToolConsole = class(TComponent)
private private
fViews: TObjectList; // list of TLazExtToolConsoleView fViews: TFPList; // list of TLazExtToolConsoleView
function GetViews(Index: integer): TLazExtToolConsoleView; function GetViews(Index: integer): TLazExtToolConsoleView;
public public
constructor Create(AOwner: TComponent); override; constructor Create(AOwner: TComponent); override;
@ -181,6 +181,7 @@ type
constructor Create(aOwner: TComponent); override; constructor Create(aOwner: TComponent); override;
destructor Destroy; override; destructor Destroy; override;
function Add(Title: string): TAbstractExternalTool; override; function Add(Title: string): TAbstractExternalTool; override;
function IndexOf(Tool: TAbstractExternalTool): integer; override;
property MaxProcessCount: integer read FMaxProcessCount write FMaxProcessCount; property MaxProcessCount: integer read FMaxProcessCount write FMaxProcessCount;
procedure Work; procedure Work;
function FindNextToolToExec: TExternalTool; function FindNextToolToExec: TExternalTool;
@ -221,18 +222,21 @@ end;
constructor TLazExtToolConsole.Create(AOwner: TComponent); constructor TLazExtToolConsole.Create(AOwner: TComponent);
begin begin
inherited Create(AOwner); inherited Create(AOwner);
fViews:=TObjectList.Create(true); fViews:=TFPList.Create;
ExtToolConsole:=Self; ExtToolConsole:=Self;
end; end;
destructor TLazExtToolConsole.Destroy; destructor TLazExtToolConsole.Destroy;
begin begin
Clear; Clear;
FreeAndNil(fViews);
ExtToolConsole:=nil; ExtToolConsole:=nil;
inherited Destroy; inherited Destroy;
end; end;
procedure TLazExtToolConsole.Clear; procedure TLazExtToolConsole.Clear;
var
i: Integer;
begin begin
while FindUnfinishedView<>nil do begin while FindUnfinishedView<>nil do begin
if Application<>nil then if Application<>nil then
@ -241,7 +245,12 @@ begin
CheckSynchronize; CheckSynchronize;
Sleep(10); Sleep(10);
end; end;
fViews.Clear; for i:=Count-1 downto 0 do begin
if i>=Count then continue;
Views[i].Free;
end;
if Count>0 then
raise Exception.Create('TLazExtToolConsole.Clear: some views failed to free');
end; end;
function TLazExtToolConsole.CreateView(Tool: TAbstractExternalTool function TLazExtToolConsole.CreateView(Tool: TAbstractExternalTool
@ -507,13 +516,14 @@ begin
EnterCriticalSection; EnterCriticalSection;
try try
for i:=0 to ViewCount-1 do begin for i:=ViewCount-1 downto 0 do begin
if i>=ViewCount then continue;
View:=Views[i]; View:=Views[i];
if ErrorMessage<>'' then if ErrorMessage<>'' then
View.SummaryMsg:=ErrorMessage View.SummaryMsg:=ErrorMessage
else else
View.SummaryMsg:='Success'; View.SummaryMsg:='Success';
View.InputClosed; View.InputClosed; // this might delete the view
end; end;
finally finally
LeaveCriticalSection; LeaveCriticalSection;
@ -600,9 +610,9 @@ destructor TExternalTool.Destroy;
begin begin
EnterCriticalSection; EnterCriticalSection;
try try
FStage:=etsDestroying;
if Thread is TExternalToolThread then if Thread is TExternalToolThread then
TExternalToolThread(Thread).Tool:=nil; TExternalToolThread(Thread).Tool:=nil;
FStage:=etsDestroying;
FreeAndNil(FProcess); FreeAndNil(FProcess);
FreeAndNil(FWorkerOutput); FreeAndNil(FWorkerOutput);
FreeAndNil(fExecuteBefore); FreeAndNil(fExecuteBefore);
@ -947,7 +957,10 @@ begin
end; end;
procedure TExternalTool.WaitForExit; procedure TExternalTool.WaitForExit;
var
MyTools: TIDEExternalTools;
begin begin
MyTools:=Tools;
repeat repeat
EnterCriticalSection; EnterCriticalSection;
try try
@ -956,11 +969,15 @@ begin
finally finally
LeaveCriticalSection; LeaveCriticalSection;
end; end;
// call synchronized tasks, this might free this tool
if MainThreadID=ThreadID then if MainThreadID=ThreadID then
if Application<>nil then if Application<>nil then
Application.ProcessMessages Application.ProcessMessages
else else
CheckSynchronize; CheckSynchronize;
// check if this tool still exists
if MyTools.IndexOf(Self)<0 then exit;
// still running => wait
Sleep(10); Sleep(10);
until false; until false;
end; end;
@ -1270,6 +1287,11 @@ begin
fItems.Add(Result); fItems.Add(Result);
end; end;
function TExternalTools.IndexOf(Tool: TAbstractExternalTool): integer;
begin
Result:=fItems.IndexOf(Tool);
end;
function TExternalTools.ParserCount: integer; function TExternalTools.ParserCount: integer;
begin begin
Result:=fParsers.Count; Result:=fParsers.Count;