* revert r9557, the performance impact is to big for an academic corner

case optimziation

git-svn-id: trunk@9603 -
This commit is contained in:
peter 2007-12-31 13:36:16 +00:00
parent 621492c968
commit 5acb3649df
20 changed files with 52 additions and 45 deletions

View File

@ -385,6 +385,7 @@ begin
InOutRes:=0; InOutRes:=0;
{ Arguments } { Arguments }
GenerateArgs; GenerateArgs;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
end. end.

View File

@ -411,6 +411,7 @@ begin
SysInitStdIO; SysInitStdIO;
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
InitSystemThreads;
{$ifdef HASVARIANT} {$ifdef HASVARIANT}
initvariantmanager; initvariantmanager;
{$endif HASVARIANT} {$endif HASVARIANT}

View File

@ -294,6 +294,8 @@ Begin
InOutRes:=0; InOutRes:=0;
{ Arguments } { Arguments }
SetupCmdLine; SetupCmdLine;
{ threading }
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
End. End.

View File

@ -298,6 +298,11 @@ begin
InOutRes:=0; InOutRes:=0;
{$endif FPC_HAS_FEATURE_CONSOLEIO} {$endif FPC_HAS_FEATURE_CONSOLEIO}
{$ifdef FPC_HAS_FEATURE_THREADING}
{ threading }
InitSystemThreads;
{$endif FPC_HAS_FEATURE_THREADING}
{$ifdef FPC_HAS_FEATURE_VARIANTS} {$ifdef FPC_HAS_FEATURE_VARIANTS}
initvariantmanager; initvariantmanager;
{$endif FPC_HAS_FEATURE_VARIANTS} {$endif FPC_HAS_FEATURE_VARIANTS}

View File

@ -577,6 +577,8 @@ begin
{ no I/O-Error } { no I/O-Error }
inoutres:=0; inoutres:=0;
InitSystemThreads;
InitVariantManager; InitVariantManager;
{$ifdef HASWIDESTRING} {$ifdef HASWIDESTRING}

View File

@ -146,5 +146,7 @@ begin
SysInitStdIO; SysInitStdIO;
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
{ Arguments }
InitSystemThreads;
initvariantmanager; initvariantmanager;
end. end.

View File

@ -656,6 +656,9 @@ Begin
AllFilesMask := '*.*'; AllFilesMask := '*.*';
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
{$ifdef FPC_HAS_FEATURE_THREADING}
InitSystemThreads;
{$endif}
{$ifdef EXCEPTIONS_IN_SYSTEM} {$ifdef EXCEPTIONS_IN_SYSTEM}
InitDPMIExcp; InitDPMIExcp;
InstallDefaultHandlers; InstallDefaultHandlers;

View File

@ -395,22 +395,6 @@ procedure finish_waitvarlist(loc_freelists: pfreelists); forward;
function try_finish_waitfixedlist(loc_freelists: pfreelists): boolean; forward; function try_finish_waitfixedlist(loc_freelists: pfreelists): boolean; forward;
procedure try_finish_waitvarlist(loc_freelists: pfreelists); forward; procedure try_finish_waitvarlist(loc_freelists: pfreelists); forward;
var
fTM: TThreadManager; external name 'fCurrentTM';
procedure do_heap_lock;
begin
if Assigned(fTM.EnterCriticalSection) then
fTM.EnterCriticalSection(heap_lock);
end;
procedure do_heap_unlock;
begin
if Assigned(fTM.LeaveCriticalSection) then
fTM.LeaveCriticalSection(heap_lock);
end;
{***************************************************************************** {*****************************************************************************
List adding/removal List adding/removal
*****************************************************************************} *****************************************************************************}
@ -750,7 +734,7 @@ begin
if not assigned(poc) and (assigned(orphaned_freelists.waitfixed) if not assigned(poc) and (assigned(orphaned_freelists.waitfixed)
or assigned(orphaned_freelists.waitvar) or (orphaned_freelists.oscount > 0)) then or assigned(orphaned_freelists.waitvar) or (orphaned_freelists.oscount > 0)) then
begin begin
do_heap_lock; entercriticalsection(heap_lock);
finish_waitfixedlist(@orphaned_freelists); finish_waitfixedlist(@orphaned_freelists);
finish_waitvarlist(@orphaned_freelists); finish_waitvarlist(@orphaned_freelists);
if orphaned_freelists.oscount > 0 then if orphaned_freelists.oscount > 0 then
@ -774,7 +758,7 @@ begin
loc_freelists^.oslist_all := poc; loc_freelists^.oslist_all := poc;
end; end;
end; end;
do_heap_unlock; leavecriticalsection(heap_lock);
end; end;
if poc = nil then if poc = nil then
begin begin
@ -1035,18 +1019,18 @@ end;
procedure waitfree_fixed(pmc: pmemchunk_fixed; poc: poschunk); procedure waitfree_fixed(pmc: pmemchunk_fixed; poc: poschunk);
begin begin
do_heap_lock; entercriticalsection(heap_lock);
pmc^.next_fixed := poc^.freelists^.waitfixed; pmc^.next_fixed := poc^.freelists^.waitfixed;
poc^.freelists^.waitfixed := pmc; poc^.freelists^.waitfixed := pmc;
do_heap_unlock; leavecriticalsection(heap_lock);
end; end;
procedure waitfree_var(pmcv: pmemchunk_var); procedure waitfree_var(pmcv: pmemchunk_var);
begin begin
do_heap_lock; entercriticalsection(heap_lock);
pmcv^.next_var := pmcv^.freelists^.waitvar; pmcv^.next_var := pmcv^.freelists^.waitvar;
pmcv^.freelists^.waitvar := pmcv; pmcv^.freelists^.waitvar := pmcv;
do_heap_unlock; leavecriticalsection(heap_lock);
end; end;
function SysFreeMem_Fixed(loc_freelists: pfreelists; pmc: pmemchunk_fixed): ptruint; function SysFreeMem_Fixed(loc_freelists: pfreelists; pmc: pmemchunk_fixed): ptruint;
@ -1157,9 +1141,9 @@ function try_finish_waitfixedlist(loc_freelists: pfreelists): boolean;
begin begin
if loc_freelists^.waitfixed = nil then if loc_freelists^.waitfixed = nil then
exit(false); exit(false);
do_heap_lock; entercriticalsection(heap_lock);
finish_waitfixedlist(loc_freelists); finish_waitfixedlist(loc_freelists);
do_heap_unlock; leavecriticalsection(heap_lock);
result := true; result := true;
end; end;
@ -1181,9 +1165,9 @@ procedure try_finish_waitvarlist(loc_freelists: pfreelists);
begin begin
if loc_freelists^.waitvar = nil then if loc_freelists^.waitvar = nil then
exit; exit;
do_heap_lock; entercriticalsection(heap_lock);
finish_waitvarlist(loc_freelists); finish_waitvarlist(loc_freelists);
do_heap_unlock; leavecriticalsection(heap_lock);
end; end;
{***************************************************************************** {*****************************************************************************
@ -1447,7 +1431,7 @@ begin
loc_freelists := @freelists; loc_freelists := @freelists;
if main_relo_freelists <> nil then if main_relo_freelists <> nil then
begin begin
do_heap_lock; entercriticalsection(heap_lock);
finish_waitfixedlist(loc_freelists); finish_waitfixedlist(loc_freelists);
finish_waitvarlist(loc_freelists); finish_waitvarlist(loc_freelists);
{$ifdef HAS_SYSOSFREE} {$ifdef HAS_SYSOSFREE}
@ -1479,9 +1463,9 @@ begin
orphaned_freelists.oslist_all := loc_freelists^.oslist_all; orphaned_freelists.oslist_all := loc_freelists^.oslist_all;
end; end;
end; end;
do_heap_unlock; leavecriticalsection(heap_lock);
if (main_relo_freelists = loc_freelists) and Assigned(fTM.DoneCriticalSection) then if main_relo_freelists = loc_freelists then
fTM.DoneCriticalSection(heap_lock); donecriticalsection(heap_lock);
end; end;
{$ifdef SHOW_MEM_USAGE} {$ifdef SHOW_MEM_USAGE}
writeln('Max heap used/size: ', loc_freelists^.internal_status.maxheapused, '/', writeln('Max heap used/size: ', loc_freelists^.internal_status.maxheapused, '/',

View File

@ -15,16 +15,7 @@
Var Var
fCurrentTM : TThreadManager; public; CurrentTM : TThreadManager;
Procedure InitSystemThreads; forward;
function CurrentTM : TThreadManager;
begin
if not Assigned(fCurrentTM.BeginThread) then
InitSystemThreads;
Result:=fCurrentTM;
end;
{***************************************************************************** {*****************************************************************************
Threadvar initialization Threadvar initialization
@ -221,13 +212,13 @@ Function SetThreadManager(Const NewTM : TThreadManager) : Boolean;
begin begin
Result:=True; Result:=True;
If Assigned(fCurrentTM.DoneManager) then If Assigned(CurrentTM.DoneManager) then
Result:=fCurrentTM.DoneManager(); Result:=CurrentTM.DoneManager();
If Result then If Result then
begin begin
fCurrentTM:=NewTM; CurrentTM:=NewTM;
If Assigned(fCurrentTM.InitManager) then If Assigned(CurrentTM.InitManager) then
Result:=fCurrentTM.InitManager(); Result:=CurrentTM.InitManager();
end; end;
end; end;

View File

@ -333,6 +333,8 @@ begin
SysInitExecPath; SysInitExecPath;
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
{ threading }
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
end. end.

View File

@ -553,6 +553,7 @@ begin
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
errno:=0; errno:=0;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;

View File

@ -417,6 +417,7 @@ begin
InOutRes:=0; InOutRes:=0;
{ Arguments } { Arguments }
GenerateArgs; GenerateArgs;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
end. end.

View File

@ -173,5 +173,7 @@ begin
SysInitStdIO; SysInitStdIO;
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
{ Arguments }
InitSystemThreads;
initvariantmanager; initvariantmanager;
end. end.

View File

@ -477,6 +477,7 @@ Begin
IsLibrary := FALSE; IsLibrary := FALSE;
IsConsole := TRUE; IsConsole := TRUE;
ExitCode := 0; ExitCode := 0;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
End. End.

View File

@ -547,6 +547,7 @@ Begin
{Delphi Compatible} {Delphi Compatible}
IsConsole := TRUE; IsConsole := TRUE;
ExitCode := 0; ExitCode := 0;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
End. End.

View File

@ -1190,6 +1190,7 @@ begin
DefaultCreator := ''; DefaultCreator := '';
DefaultFileType := ''; DefaultFileType := '';
InitSystemThreads;
InitVariantManager; InitVariantManager;
{$ifdef HASWIDESTRING} {$ifdef HASWIDESTRING}

View File

@ -229,6 +229,7 @@ Begin
InOutRes:=0; InOutRes:=0;
{ Arguments } { Arguments }
SetupCmdLine; SetupCmdLine;
InitSystemThreads;
initvariantmanager; initvariantmanager;
initwidestringmanager; initwidestringmanager;
End. End.

View File

@ -1219,6 +1219,8 @@ begin
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
ProcessID := GetCurrentProcessID; ProcessID := GetCurrentProcessID;
{ threading }
InitSystemThreads;
{ Reset internal error variable } { Reset internal error variable }
errno:=0; errno:=0;
initvariantmanager; initvariantmanager;

View File

@ -1172,6 +1172,8 @@ begin
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
ProcessID := GetCurrentProcessID; ProcessID := GetCurrentProcessID;
{ threading }
InitSystemThreads;
{ Reset internal error variable } { Reset internal error variable }
errno:=0; errno:=0;
initvariantmanager; initvariantmanager;

View File

@ -1812,6 +1812,8 @@ initialization
{ Reset IO Error } { Reset IO Error }
InOutRes:=0; InOutRes:=0;
ProcessID := GetCurrentProcessID; ProcessID := GetCurrentProcessID;
{ threading }
InitSystemThreads;
{ Reset internal error variable } { Reset internal error variable }
errno:=0; errno:=0;
initvariantmanager; initvariantmanager;