mirror of
https://gitlab.com/freepascal.org/fpc/source.git
synced 2025-05-31 21:22:46 +02:00

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 -
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.
|