mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-04-07 17:47:56 +02:00
82 lines
1.4 KiB
ObjectPascal
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.
|