/// <summary> /// Dispose. /// </summary> /// <since_tizen> 3 </since_tizen> protected virtual void Dispose(DisposeTypes type) { if (disposed) { return; } NUILog.Debug($"[Dispose] BaseHandle.Dispose({type}) START"); if (type == DisposeTypes.Explicit) { //Called by User //Release your own managed resources here. //You should release all of your own disposable objects here. } //Release your own unmanaged resources here. //You should not access any managed member here except static instance. //because the execution order of Finalizes is non-deterministic. //Unreference this instance from Registry. if (registerMe) { Registry.Unregister(this); } #if NUI_DEBUG_ON debuggingCount--; NUILog.Debug($"[Dispose] swigCMemOwn:{swigCMemOwn} debuggingCount:{debuggingCount} type:{GetType()} copyNativeHandle:{swigCPtrCopy.Handle.ToString("X8")}"); #endif // this is temporary test code. will be removed laster { if (swigCPtr.Handle != IntPtr.Zero && swigCPtrCopy.Handle != IntPtr.Zero) { var process = global::System.Diagnostics.Process.GetCurrentProcess().Id; var thread = global::System.Threading.Thread.CurrentThread.ManagedThreadId; var me = this.GetType().FullName; var daliId = "unknown"; var hash = this.GetType().GetHashCode(); var name = "unknown"; if (this is BaseComponents.View) { daliId = Interop.Actor.GetId(swigCPtrCopy).ToString(); name = Interop.Actor.GetName(swigCPtrCopy); BaseObject tmp = new BaseObject(Interop.BaseHandle.GetBaseObject(swigCPtrCopy), false); var refCnt = tmp.ReferenceCount(); tmp.Dispose(); if (refCnt > 2) { Log.Error("NUI", $"[ERR] reference count is over than 2. Could be a memory leak. Need to check! \n" + $" process:{process} thread:{thread}, isDisposed:{this.disposed}, isDisposeQueued:{this.isDisposeQueued}, me:{me} \n" + $" disposeType:{type}, name:{name}, daliID:{daliId}, hash:{hash}, refCnt:{refCnt}"); } } } } if (SwigCPtr.Handle != IntPtr.Zero) { if (swigCMemOwn) { swigCMemOwn = false; ReleaseSwigCPtr(SwigCPtr); } swigCPtr = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } else { var me = this.GetType().FullName; Log.Error("NUI", $"[ERR] SwigCPtr is NULL, need to check! me:{me}"); } if (swigCPtrCopy.Handle != global::System.IntPtr.Zero) { swigCMemOwn = false; Interop.BaseHandle.DeleteBaseHandle(swigCPtrCopy); swigCPtrCopy = new global::System.Runtime.InteropServices.HandleRef(null, global::System.IntPtr.Zero); } else { var me = this.GetType().FullName; Log.Error("NUI", $"[ERR] swigCPtrCopy is NULL, need to check! me:{me}"); } disposed = true; if (null != Application.Current) { Application.Current.XamlResourceChanged -= OnResourcesChanged; } NUILog.Debug($"[Dispose] BaseHandle.Dispose({type}) END"); NUILog.Debug($"============================="); }