fpc/tests/webtbs/tw35027.pp
svenbarth 7364cd59b5 * always enable threads on Unix-like targets
git-svn-id: trunk@41308 -
2019-02-11 20:33:29 +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.