Files
lazarus-ccr/wst/trunk/wst_initialization.pas
inoussa 6bde0600c1 Finalization order
git-svn-id: https://svn.code.sf.net/p/lazarus-ccr/svn@2465 8e941d3f-bd1b-0410-a28a-d453659cc2b4
2012-06-13 14:55:23 +00:00

96 lines
2.0 KiB
ObjectPascal

{$INCLUDE wst_global.inc}
unit wst_initialization;
interface
uses
Classes, SysUtils;
type
TwstInitializationProc = procedure();
TwstFinalizationProc = TwstInitializationProc;
procedure wst_initialize();
procedure wst_add_init_proc(const AProc : TwstInitializationProc);
procedure wst_add_final_proc(const AProc : TwstFinalizationProc);
procedure wst_add_procs(const AInitProc : TwstInitializationProc; const AFinalProc : TwstFinalizationProc);
procedure wst_finalize();
implementation
var
Initialized : Boolean = False;
InitProcs : TList;
FinalProcs : TList;
procedure wst_prepare();
begin
if ( InitProcs = nil ) then begin
Initialized := False;
InitProcs := TList.Create();
FinalProcs := TList.Create();
end;
end;
procedure wst_add_init_proc(const AProc : TwstInitializationProc);
begin
wst_prepare();
if Assigned(AProc) and ( InitProcs.IndexOf(@AProc) = -1 ) then
InitProcs.Add(@AProc);
end;
procedure wst_add_final_proc(const AProc : TwstFinalizationProc);
begin
wst_prepare();
if ( @AProc <> nil ) and ( FinalProcs.IndexOf(@AProc) = -1 ) then
FinalProcs.Add(@AProc);
end;
procedure wst_add_procs(const AInitProc : TwstInitializationProc; const AFinalProc : TwstFinalizationProc);
begin
wst_add_init_proc(AInitProc);
wst_add_final_proc(AFinalProc);
end;
procedure wst_initialize();
var
i, c : Integer;
p : TwstInitializationProc;
begin
wst_prepare();
Initialized := True;
c := InitProcs.Count;
for i := 0 to Pred(c) do begin
p := TwstInitializationProc(InitProcs[i]);
p();
end;
end;
procedure wst_finalize();
var
i : Integer;
p : TwstInitializationProc;
begin
if Initialized then begin
Initialized := False;
if ( FinalProcs <> nil ) then begin
i := FinalProcs.Count - 1;
while (i >= 0) do begin
p := TwstFinalizationProc(FinalProcs[i]);
p();
Dec(i);
end;
end;
end;
FreeAndNil(FinalProcs);
FreeAndNil(InitProcs);
end;
initialization
finalization
wst_finalize();
end.