示例#1
0
            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);
        }