Procházet zdrojové kódy

* [uutlMessages] removed autofree of sync messages because of deadlock

master
Bergmann89 před 9 roky
rodič
revize
e9856d25ed
1 změnil soubory, kde provedl 4 přidání a 34 odebrání
  1. +4
    -34
      uutlMessages.pas

+ 4
- 34
uutlMessages.pas Zobrazit soubor

@@ -46,13 +46,10 @@ type
TutlSynchronousMessage = class(TutlMessage)
private
fEvent: TEvent;
fFreeOnFinish: Boolean;
fLock: Integer;
procedure Lock;
procedure Unlock;
public
procedure Finish;
function WaitFor(const aTimeout: Cardinal): TWaitResult;

constructor Create(const aID: Cardinal; const aWParam, aLParam: PtrInt); overload;
constructor Create(const {%H-}aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean = true); overload;
destructor Destroy; override;
@@ -108,57 +105,30 @@ end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//TutlSynchronousMessage//////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlSynchronousMessage.Lock;
begin
repeat until (InterLockedExchange(fLock, 1) = 0);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlSynchronousMessage.Unlock;
begin
InterLockedExchange(fLock, 0);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
procedure TutlSynchronousMessage.Finish;
begin
fEvent.SetEvent;
Lock;
if fFreeOnFinish then
Free
else
Unlock;
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
function TutlSynchronousMessage.WaitFor(const aTimeout: Cardinal): TWaitResult;
begin
Lock;
try
result := fEvent.WaitFor(aTimeout);
fFreeOnFinish := (result <> wrSignaled);
finally
Unlock;
end;
result := fEvent.WaitFor(aTimeout);
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlSynchronousMessage.Create(const aID: Cardinal; const aWParam, aLParam: PtrInt);
begin
inherited Create(aID, aWParam, aLParam);
fEvent := TEvent.Create(nil, true, false, '');
fFreeOnFinish := false;
fLock := 0;
fEvent := TEvent.Create(nil, true, false, '');
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
constructor TutlSynchronousMessage.Create(const aID: Cardinal; const aArgs: TObject; const aOwnsObjects: Boolean);
begin
inherited Create(ID, aArgs, aOwnsObjects);
fEvent := TEvent.Create(nil, true, false, '');
fFreeOnFinish := false;
fLock := 0;
fEvent := TEvent.Create(nil, true, false, '');
end;

////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////


Načítá se…
Zrušit
Uložit