예제 #1
0
        public static CleanupNotifier.RegistrationToken RegisterForCleanup(IntPtr cleanupObjectCPtr, IntPtr notifyObjectCPtr, object notifyObject, Type notifyObjectType, CleanupNotifier.DisposeObjectDelegate disposeObjectDelegate, CleanupNotifier.DeleteObjectDelegate deleteObjectDelegate)
        {
            object obj = CleanupNotifier.cleanupIdToContext;

            CleanupNotifier.RegistrationToken result;
            lock (obj) {
                result = CleanupNotifier.RegistrationToken.Create(CleanupNotifier.cleanupIdToContext);
                CleanupNotifier.cleanupIdToContext[result.Identifier] = new CleanupNotifier.ObjectCleanupContext {
                    NotifyObjectType  = notifyObjectType,
                    NotifyObject      = notifyObject,
                    DisposeObject     = disposeObjectDelegate,
                    DeleteObject      = deleteObjectDelegate,
                    CleanupObjectCPtr = cleanupObjectCPtr,
                    NotifyObjectCPtr  = notifyObjectCPtr
                };
                if (CleanupNotifier.f__mgcache0 == null)
                {
                    CleanupNotifier.f__mgcache0 = new CleanupNotifierBridge.CleanupDelegate(CleanupNotifier.PerformCleanup);
                }
                if (!CleanupNotifierBridge.RegisterCleanupDelegate(cleanupObjectCPtr, notifyObjectCPtr, CleanupNotifier.f__mgcache0, (IntPtr)result.Identifier))
                {
                    CleanupNotifier.cleanupIdToContext.Remove(result.Identifier);
                    throw new NullReferenceException(string.Format("{0} (instance 0x{1:X}) can't be registered for cleanup with 0x{2:X}.", notifyObjectType, notifyObjectCPtr, cleanupObjectCPtr));
                }
                FirebaseApp.LogMessage(LogLevel.Debug, string.Format("{0} (instance 0x{1:X}) registered for cleanup when 0x{2:X} is destroyed", notifyObjectType, (long)notifyObjectCPtr, (long)cleanupObjectCPtr));
            }
            return(result);
        }
        public static bool RegisterCleanupDelegate(IntPtr cleanupObject, IntPtr notifyObject, CleanupNotifierBridge.CleanupDelegate cleanupDelegate, IntPtr context)
        {
            bool result = AppUtilPINVOKE.CleanupNotifierBridge_RegisterCleanupDelegate(cleanupObject, notifyObject, cleanupDelegate, context);

            if (AppUtilPINVOKE.SWIGPendingException.Pending)
            {
                throw AppUtilPINVOKE.SWIGPendingException.Retrieve();
            }
            return(result);
        }
 public static extern bool CleanupNotifierBridge_RegisterCleanupDelegate(IntPtr jarg1, IntPtr jarg2, CleanupNotifierBridge.CleanupDelegate jarg3, IntPtr jarg4);