internal static void FreeComObject <T>(ref T obj) where T : class { #if false // When debug -> use special version, that writes debug information ComDebug.DebugFreeComObject(ref obj); #else // take it to local variable var localObj = Interlocked.Exchange(ref obj, null); // if it is already null -> return if (localObj == null) { return; } Marshal.ReleaseComObject(localObj); #endif }
public void IsOperatorRefCounterTest() { // operator is is NOT increment counters var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array); int comCount1 = ComDebug.GetComRefCount(item1); int rcwCount1 = ComDebug.GetRcwRefCount(item1); bool test = item1 is nsIArray; int comCount2 = ComDebug.GetComRefCount(item1); int rcwCount2 = ComDebug.GetRcwRefCount(item1); int free = Marshal.ReleaseComObject(item1); Assert.AreEqual(0, comCount2 - comCount1); Assert.AreEqual(0, rcwCount2 - rcwCount1); Assert.AreEqual(0, free); }
public void QueryInterfaceRefCounterTest() { var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array); int comCount1 = ComDebug.GetComRefCount(item1); int rcwCount1 = ComDebug.GetRcwRefCount(item1); var item2 = Xpcom.QueryInterface <nsIArray>(item1); int comCount2 = ComDebug.GetComRefCount(item2); int rcwCount2 = ComDebug.GetRcwRefCount(item2); int free1 = Marshal.ReleaseComObject(item2); int free2 = Marshal.ReleaseComObject(item1); Assert.AreEqual(0, comCount2 - comCount1); Assert.AreEqual(1, rcwCount2 - rcwCount1); Assert.AreEqual(1, free1); Assert.AreEqual(0, free2); }
public void ExplicitOperatorRefCounterTest() { // operator explicit is NOT increment counters var item1 = Xpcom.CreateInstance <nsISupports>(Contracts.Array); int comCount = ComDebug.GetComRefCount(item1); int rcwCount = ComDebug.GetRcwRefCount(item1); nsIArray item2 = (nsIArray)item1; int comCount1 = ComDebug.GetComRefCount(item1); int rcwCount1 = ComDebug.GetRcwRefCount(item1); int comCount2 = ComDebug.GetComRefCount(item2); int rcwCount2 = ComDebug.GetRcwRefCount(item2); int free = Marshal.ReleaseComObject(item2); Assert.AreEqual(0, comCount2 - comCount1); Assert.AreEqual(0, rcwCount2 - rcwCount1); Assert.AreEqual(0, comCount2 - comCount); Assert.AreEqual(0, rcwCount2 - rcwCount); Assert.AreEqual(0, free); }