|
@@ -30,7 +30,7 @@ type
|
|
const
|
|
const
|
|
TotalThreadCount = 100;
|
|
TotalThreadCount = 100;
|
|
TestCount = 1000000;
|
|
TestCount = 1000000;
|
|
- WaitTime = 30;
|
|
|
|
|
|
+ WaitTime = 60;
|
|
|
|
|
|
var
|
|
var
|
|
Counter, Counter2, Counter3: longint;
|
|
Counter, Counter2, Counter3: longint;
|
|
@@ -43,6 +43,11 @@ function InterlockedCompareExchange(var Target: longint; NewValue: longint; Comp
|
|
begin
|
|
begin
|
|
Result:=longint(Windows.InterlockedCompareExchange(pointer(Target), pointer(NewValue), pointer(Comperand)));
|
|
Result:=longint(Windows.InterlockedCompareExchange(pointer(Target), pointer(NewValue), pointer(Comperand)));
|
|
end;
|
|
end;
|
|
|
|
+
|
|
|
|
+procedure ThreadSwitch;
|
|
|
|
+begin
|
|
|
|
+ Sleep(0);
|
|
|
|
+end;
|
|
{$endif FPC}
|
|
{$endif FPC}
|
|
|
|
|
|
procedure CheckResult(check, expected, code: longint; const Msg: string);
|
|
procedure CheckResult(check, expected, code: longint; const Msg: string);
|
|
@@ -123,21 +128,18 @@ begin
|
|
if AbortThread then
|
|
if AbortThread then
|
|
break;
|
|
break;
|
|
Inc(j);
|
|
Inc(j);
|
|
- if j >= 10000 then begin
|
|
|
|
|
|
+ if j and $FFF = 0 then begin
|
|
if Now - t >= 5/SecsPerDay then begin
|
|
if Now - t >= 5/SecsPerDay then begin
|
|
writeln('InterLockedCompareExchange seems to be broken.');
|
|
writeln('InterLockedCompareExchange seems to be broken.');
|
|
Halt(10);
|
|
Halt(10);
|
|
end;
|
|
end;
|
|
Sleep(1);
|
|
Sleep(1);
|
|
- end
|
|
|
|
- else
|
|
|
|
- if j >= 100 then
|
|
|
|
- Sleep(0);
|
|
|
|
- {$ifdef FPC}
|
|
|
|
- ThreadSwitch;
|
|
|
|
- {$else}
|
|
|
|
- Sleep(0);
|
|
|
|
- {$endif FPC}
|
|
|
|
|
|
+ end;
|
|
|
|
+ if j and $3F = 0 then begin
|
|
|
|
+ Sleep(0);
|
|
|
|
+ end;
|
|
|
|
+ if j and $3 = 1 then
|
|
|
|
+ ThreadSwitch;
|
|
end;
|
|
end;
|
|
if AbortThread then
|
|
if AbortThread then
|
|
break;
|
|
break;
|
|
@@ -156,7 +158,7 @@ end;
|
|
procedure Run;
|
|
procedure Run;
|
|
var
|
|
var
|
|
i, j, k, CmpCount: longint;
|
|
i, j, k, CmpCount: longint;
|
|
- t, tt: TDateTime;
|
|
|
|
|
|
+ t: TDateTime;
|
|
workers: array[0..TotalThreadCount - 1] of TWorker;
|
|
workers: array[0..TotalThreadCount - 1] of TWorker;
|
|
begin
|
|
begin
|
|
Counter:=0;
|
|
Counter:=0;
|
|
@@ -218,14 +220,16 @@ begin
|
|
Halt(2);
|
|
Halt(2);
|
|
end;
|
|
end;
|
|
|
|
|
|
- tt:=Now;
|
|
|
|
|
|
+ t:=Now - t;
|
|
|
|
+ if t = 0 then
|
|
|
|
+ t:=1/MSecsPerDay;
|
|
|
|
|
|
CheckResult(Counter, 0, 1, 'Counter error:');
|
|
CheckResult(Counter, 0, 1, 'Counter error:');
|
|
|
|
|
|
CheckResult(Counter2, (k div 2)*CmpCount, 4, 'Counter2 error:');
|
|
CheckResult(Counter2, (k div 2)*CmpCount, 4, 'Counter2 error:');
|
|
|
|
|
|
writeln('Test OK.');
|
|
writeln('Test OK.');
|
|
- writeln('InterLockedCompareExchange: ', Round(Counter2/((tt-t)*SecsPerDay)), ' ops/sec.');
|
|
|
|
|
|
+ writeln('InterLockedCompareExchange: ', Round(Counter2/(t*SecsPerDay)), ' ops/sec.');
|
|
end;
|
|
end;
|
|
|
|
|
|
begin
|
|
begin
|