/* ************************************************************** */ #region Private Static Functions /// <summary> /// This event handler is called by the native layer whenever the subscription has been fully destroyed. /// Note that clean up will only be performed if the subscription is about to be destroyed or deallocated, /// this can be determined by using the getState function. /// </summary> /// <param name="subscription"> /// The native subscription. /// </param> /// <param name="closure"> /// The closure passed down to the native layer. /// </param> private static void onDestroy(IntPtr subscription, IntPtr closure) { // Obtain the handle from the closure GCHandle handle = (GCHandle)closure; /* If the target is a basic impl then createBasic has been invoked on this class instead of the base class, * however as the MamaSubscriptionImpl is a derived class from MamaBasicSubscriptionImpl we must check for * the derived class first. */ if (handle.Target is MamaSubscriptionImpl) { // Extract the impl from the handle MamaSubscriptionImpl impl = (MamaSubscriptionImpl)handle.Target; /* Get the state before the destroy is called, (in case the user recreates the subscription on * the callback). */ mamaSubscriptionState state = impl.Subscription.State; // Use the impl to invoke the destroy callback, (if this has been supplied) impl.InvokeDestroy(); // If we are destroying rather than deactivating then delete the impl if ((mamaSubscriptionState.MAMA_SUBSCRIPTION_DESTROYED == state) || (mamaSubscriptionState.MAMA_SUBSCRIPTION_DEALLOCATING == state)) { /* The subscription has now been destroyed or deleted and the impl is no longer required, free the handle to * allow the garbage collector to clean it up. */ handle.Free(); } } else if (handle.Target is MamaBasicSubscriptionImpl) { // Extract the impl from the handle MamaBasicSubscriptionImpl impl = (MamaBasicSubscriptionImpl)handle.Target; // Use the impl to invoke the destroy callback, (if this has been supplied) impl.InvokeDestroy(); /* The timer has now been destroyed and the impl is no longer required, free the handle to * allow the garbage collector to clean it up. */ handle.Free(); } else { // Otherwise something has gone wrong throw new InvalidOperationException(); } }
/// <summary> /// This event handler is called by the native layer whenever the subscription has been fully destroyed. /// It will perform all clean-up and then invoke the onDestroy callback function if this has /// been supplied. /// </summary> /// <param name="subscription"> /// The native subscription. /// </param> /// <param name="closure"> /// The closure passed down to the native layer. /// </param> private static void onDestroy(IntPtr subscription, IntPtr closure) { // Obtain the handle from the closure GCHandle handle = (GCHandle)closure; // Extract the impl from the handle MamaBasicSubscriptionImpl impl = (MamaBasicSubscriptionImpl)handle.Target; // Use the impl to invoke the destroy callback, (if this has been supplied) impl.InvokeDestroy(); /* The timer has now been destroyed and the impl is no longer required, free the handle to * allow the garbage collector to clean it up. */ handle.Free(); }