From ee0df892d87aeb3d46edd0e5f3c0de9e8e33787b Mon Sep 17 00:00:00 2001 From: martin Date: Sun, 2 Mar 2014 02:22:18 +0000 Subject: [PATCH] LazUtils: helper for refcnt object git-svn-id: trunk@44313 - --- components/lazutils/lazclasses.pas | 27 ++++++++++++++++++++++++--- 1 file changed, 24 insertions(+), 3 deletions(-) diff --git a/components/lazutils/lazclasses.pas b/components/lazutils/lazclasses.pas index 6c83706e69..1dad543717 100644 --- a/components/lazutils/lazclasses.pas +++ b/components/lazutils/lazclasses.pas @@ -56,7 +56,8 @@ type end; -procedure ReleaseRefAndNil(var ARefCountedObject); +procedure ReleaseRefAndNil(var ARefCountedObject {$IFDEF WITH_REFCOUNT_DEBUG}; DebugIdAdr: Pointer = nil; DebugIdTxt: String = ''{$ENDIF}); +procedure NilThenReleaseRef(var ARefCountedObject {$IFDEF WITH_REFCOUNT_DEBUG}; DebugIdAdr: Pointer = nil; DebugIdTxt: String = ''{$ENDIF}); implementation {$IFDEF WITH_REFCOUNT_DEBUG} @@ -227,7 +228,7 @@ begin end; end; -procedure ReleaseRefAndNil(var ARefCountedObject); +procedure ReleaseRefAndNil(var ARefCountedObject {$IFDEF WITH_REFCOUNT_DEBUG}; DebugIdAdr: Pointer = nil; DebugIdTxt: String = ''{$ENDIF}); begin Assert( (Pointer(ARefCountedObject) = nil) or (TObject(ARefCountedObject) is TRefCountedObject), @@ -237,9 +238,29 @@ begin exit; if (TObject(ARefCountedObject) is TRefCountedObject) then - TRefCountedObject(ARefCountedObject).ReleaseReference; + TRefCountedObject(ARefCountedObject).ReleaseReference{$IFDEF WITH_REFCOUNT_DEBUG}(DebugIdAdr, DebugIdTxt){$ENDIF}; Pointer(ARefCountedObject) := nil; end; +procedure NilThenReleaseRef(var ARefCountedObject {$IFDEF WITH_REFCOUNT_DEBUG}; DebugIdAdr: Pointer = nil; DebugIdTxt: String = ''{$ENDIF}); +var + RefObj: TRefCountedObject; +begin + Assert( (Pointer(ARefCountedObject) = nil) or + (TObject(ARefCountedObject) is TRefCountedObject), + 'ReleaseRefAndNil requires TRefCountedObject'); + + if Pointer(ARefCountedObject) = nil then + exit; + + if (TObject(ARefCountedObject) is TRefCountedObject) then + RefObj := TRefCountedObject(ARefCountedObject) + else RefObj := nil; + Pointer(ARefCountedObject) := nil; + + if RefObj <> nil then + RefObj.ReleaseReference{$IFDEF WITH_REFCOUNT_DEBUG}(DebugIdAdr, DebugIdTxt){$ENDIF}; +end; + end .