void Dispose(JniObjectReference h, IJavaPeerable value) { value.Disposed(); Remove(value); var o = Runtime.ObjectReferenceManager; if (o.LogGlobalReferenceMessages) { o.WriteGlobalReferenceLine("Disposing PeerReference={0} IdentityHashCode=0x{1} Instance=0x{2} Instance.Type={3} Java.Type={4}", h.ToString(), value.JniIdentityHashCode.ToString("x"), RuntimeHelpers.GetHashCode(value).ToString("x"), value.GetType().ToString(), JniEnvironment.Types.GetJniTypeNameFromInstance(h)); } #if FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES var lref = value.PeerReference.SafeHandle as JniLocalReference; if (lref != null && !JniEnvironment.IsHandleValid(lref)) { // `lref` was created on another thread, and CANNOT be disposed on this thread. // Just invalidate the reference and move on. lref.SetHandleAsInvalid(); } #endif // FEATURE_JNIOBJECTREFERENCE_SAFEHANDLES JniObjectReference.Dispose(ref h); value.SetPeerReference(new JniObjectReference()); GC.SuppressFinalize(value); }
public virtual void CreatedLocalReference(JniObjectReference reference, ref int localReferenceCount) { if (!reference.IsValid) { return; } AssertCount(localReferenceCount, "LREF", reference.ToString()); localReferenceCount++; }
public virtual JniObjectReference CreateLocalReference(JniObjectReference reference, ref int localReferenceCount) { if (!reference.IsValid) { return(reference); } AssertCount(localReferenceCount, "LREF", reference.ToString()); localReferenceCount++; return(JniEnvironment.References.NewLocalRef(reference)); }
static void AssertReferenceType(ref JniObjectReference reference, JniObjectReferenceType type) { if (reference.Type == type) { return; } Debug.Assert(reference.Type == type, string.Format("Object reference {0} should be of type {1}, is instead {2}!", reference.ToString(), type, reference.Type)); }
public virtual void DeleteWeakGlobalReference(ref JniObjectReference reference) { if (!reference.IsValid) { return; } AssertReferenceType(ref reference, JniObjectReferenceType.WeakGlobal); AssertCount(WeakGlobalReferenceCount, "WGREF", reference.ToString()); JniEnvironment.References.DeleteWeakGlobalRef(reference.Handle); reference.Invalidate(); }
public virtual JniObjectReference CreateWeakGlobalReference(JniObjectReference reference) { if (!reference.IsValid) { return(reference); } var n = JniEnvironment.References.NewWeakGlobalRef(reference); AssertCount(WeakGlobalReferenceCount, "WGREF", reference.ToString()); return(n); }
public virtual void DeleteLocalReference(ref JniObjectReference reference, ref int localReferenceCount) { if (!reference.IsValid) { return; } AssertReferenceType(ref reference, JniObjectReferenceType.Local); localReferenceCount--; AssertCount(localReferenceCount, "LREF", reference.ToString()); JniEnvironment.References.DeleteLocalRef(reference.Handle); reference.Invalidate(); }
public virtual IntPtr ReleaseLocalReference(ref JniObjectReference reference, ref int localReferenceCount) { if (!reference.IsValid) { return(IntPtr.Zero); } localReferenceCount--; AssertCount(localReferenceCount, "LREF", reference.ToString()); var h = reference.Handle; reference.Invalidate(); return(h); }
public virtual JniObjectReference CreateGlobalReference(JniObjectReference reference) { if (!reference.IsValid) { return(reference); } var n = JniEnvironment.References.NewGlobalRef(reference); if (GlobalReferenceCount < 0) { AssertCount(GlobalReferenceCount, "GREF", reference.ToString()); } return(n); }
static void DeletedReference(TextWriter?writer, string kind, int count, JniObjectReference reference, JniRuntime runtime) { if (writer == null) { return; } string message = $"{kind} {count} handle {reference.ToString ()} " + $"from thread '{runtime.GetCurrentManagedThreadName ()}'({Environment.CurrentManagedThreadId})" + Environment.NewLine + runtime.GetCurrentManagedThreadStackTrace(skipFrames: 2, fNeedFileInfo: true); writer.WriteLine(message); writer.Flush(); }
public override void DeleteWeakGlobalReference(ref JniObjectReference reference) { if (!reference.IsValid) { return; } int wc = Interlocked.Decrement(ref wgrefCount); int gc = grefCount; if (grefLog != null) { string message = $"-w- grefc {gc} gwrefc {wc} handle {reference.ToString ()} " + $"from thread '{Runtime.GetCurrentManagedThreadName ()}'({Environment.CurrentManagedThreadId})" + Environment.NewLine + Runtime.GetCurrentManagedThreadStackTrace(skipFrames: 2, fNeedFileInfo: true); grefLog.WriteLine(message); grefLog.Flush(); } base.DeleteWeakGlobalReference(ref reference); }
public override JniObjectReference CreateWeakGlobalReference(JniObjectReference reference) { if (!reference.IsValid) { return(reference); } var n = base.CreateWeakGlobalReference(reference); int wc = Interlocked.Increment(ref wgrefCount); int gc = grefCount; if (grefLog != null) { string message = $"+w+ grefc {gc} gwrefc {wc} obj-handle {reference.ToString ()} -> new-handle {n.ToString ()} " + $"from thread '{Runtime.GetCurrentManagedThreadName ()}'({Environment.CurrentManagedThreadId})" + Environment.NewLine + Runtime.GetCurrentManagedThreadStackTrace(skipFrames: 2, fNeedFileInfo: true); grefLog.WriteLine(message); grefLog.Flush(); } return(n); }