fpc/tests/webtbs/tw35027.pp
marco 037583ef4e --- Merging r40654 into '.':
U    compiler/msg/errore.msg
--- Recording mergeinfo for merge of r40654 into '.':
 U   .
--- Merging r40656 into '.':
U    compiler/pdecvar.pas
A    tests/tbf/tb0266a.pp
A    tests/tbf/tb0266b.pp
--- Recording mergeinfo for merge of r40656 into '.':
 G   .
--- Merging r41308 into '.':
U    tests/webtbs/tw35027.pp
--- Recording mergeinfo for merge of r41308 into '.':
 G   .
--- Merging r41829 into '.':
U    compiler/htypechk.pas
U    compiler/ncal.pas
A    tests/tbs/tb0656.pp
--- Recording mergeinfo for merge of r41829 into '.':
 G   .
--- Merging r42511 into '.':
U    packages/rtl-objpas/src/inc/rtti.pp
U    rtl/objpas/typinfo.pp
U    tests/test/trtti19.pp
--- Recording mergeinfo for merge of r42511 into '.':
 G   .

# revisions: 40654,40656,41308,41829,42511

git-svn-id: branches/fixes_3_2@43410 -
2019-11-07 10:04:13 +00:00

82 lines
1.4 KiB
ObjectPascal

program tw35027;
{$mode objfpc}{$H+}
uses
{$IFDEF UNIX}cthreads,{$ENDIF}
Classes, sysutils, syncobjs;
type
MT1= class(TThread)
procedure Execute; override;
private
procedure MySync;
end;
{ MT2 }
MT2= class(TThread)
procedure Execute; override;
private
procedure MySync2;
end;
var
E1, E2, E3: TEventObject;
T1: MT1;
T2: MT2;
MT1Count, MT2Count: Integer;
{ MT2 }
procedure MT2.Execute;
begin
E1.WaitFor(INFINITE);
Sleep(100);
try
Synchronize(@MySync2);
except end;
end;
procedure MT2.MySync2;
begin
Inc(MT2Count);
writeln('x2 ');
raise Exception.Create('Foo'); // prevent event^.Method from being set to nil
end;
procedure MT1.Execute;
begin
E1.SetEvent;
try
Synchronize(@MySync);
except end;
E3.SetEvent;
E2.WaitFor(INFINITE);
try
Synchronize(@MySync);
except end;
end;
procedure MT1.MySync;
begin
Inc(MT1Count);
writeln('x');
raise Exception.Create('Foo'); // prevent event^.Next from being set to nil
end;
begin
E1 := TEvent.Create(Nil, False, False, '');
E2 := TEvent.Create(Nil, False, False, '');
E3 := TEvent.Create(Nil, False, False, '');
T1 := MT1.Create(False);
T2 := MT2.Create(False);
Sleep(2000);
CheckSynchronize(1000);
CheckSynchronize(1000);
E3.WaitFor(INFINITE);
E2.SetEvent;
CheckSynchronize(1000);
CheckSynchronize(1000);
if (MT1Count <> 2) or (MT2Count <> 1) then
Halt(1);
Writeln('ok');
end.