private static void CheckNDisposeObject(bool finalize, IChoDisposable disposableObj, Action <bool> disposeMethod) { if (disposableObj.IsDisposed) { return; } bool isDisposeSuccess = true; if (disposeMethod == null) { disposableObj.Dispose(finalize); //if (ChoType.HasMethod(disposableObj, "Dispose", new object[] { finalize })) // ChoType.InvokeMethod(disposableObj, "Dispose", new object[] { finalize }); //else // isDisposeSuccess = false; } else { disposeMethod(finalize); } if (!finalize && isDisposeSuccess) { GC.SuppressFinalize(disposableObj); } else { AppDomain currentDomain = AppDomain.CurrentDomain; if (!currentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted) { ReportMemoryLeak(disposableObj); } } }
private static void ReportMemoryLeak(IChoDisposable target) { return; ChoGuard.ArgumentNotNull(target, "Target"); if (target.IsDisposed) { return; } ChoDisposableObjectAttribute disposableObjectAttribute = ChoType.GetAttribute <ChoDisposableObjectAttribute>(target.GetType()); if (disposableObjectAttribute == null || !disposableObjectAttribute.ContainsUnmanagedResources) { return; } AppDomain currentDomain = AppDomain.CurrentDomain; if (!currentDomain.IsFinalizingForUnload() && !Environment.HasShutdownStarted) { ChoStringMsgBuilder msg = new ChoStringMsgBuilder(target.GetType().FullName); //Console.WriteLine("Object allocated at:"); for (int index = 0; index < target.ObjectCreationStackTrace.FrameCount; ++index) { StackFrame frame = target.ObjectCreationStackTrace.GetFrame(index); msg.AppendLine(" {0}", frame.ToString()); } //ChoProfile.DefaultContext.AppendLine(msg.ToString()); } }
public static void NotDisposed(IChoDisposable obj) { ChoGuard.ArgumentNotNull(obj, "obj"); if (obj.IsDisposed) { throw new ObjectDisposedException(obj.GetType().Name); } }
private static void Dispose(bool finalize, IChoDisposable disposableObj) { if (disposableObj.IsDisposed) { return; } disposableObj.IsDisposed = true; if (ChoType.HasMethod(disposableObj, "Dispose", new object[] { finalize })) { ChoType.InvokeMethod(disposableObj, "Dispose", new object[] { finalize }); } //disposableObj.Dispose(finalize); }
public static void Dispose(IDisposable target, bool finalize) { ChoGuard.ArgumentNotNull(target, "Target"); if (target is IChoDisposable) { IChoDisposable disposableObj = target as IChoDisposable; if (disposableObj is IChoSyncDisposable && ((IChoSyncDisposable)disposableObj).DisposableLockObj != null) { lock (((IChoSyncDisposable)disposableObj).DisposableLockObj) { Dispose(finalize, disposableObj); } } else { Dispose(finalize, disposableObj); } } else { target.Dispose(); } }
internal static bool IsDisposed(IChoDisposable obj) { ChoGuard.ArgumentNotNull(obj, "obj"); return(obj.IsDisposed); }