Early releases of lock in mamaSubscription destroy/deallocate logic


Slade, Michael J
 

Hi OpenMAMA Devs,

 

In the subscription destroy/deallocate logic, there are a couple of functions which seem to release the lock used to protect access to the subscription structure early – i.e. before the user callback ‘mamaSubscriptionImpl_invokeDestroyedCallback’ or ‘mamaSubscriptionImpl_deallocate’ function is invoked. Is anyone able to explain why the lock is released in this way, and not held until the end of the function?
 
Thanks in advance,
Mike

mamaSubscription_destroy:2848

mama_status mamaSubscription_destroy(mamaSubscription subscription)

{

    /* Returns. */

    mama_status ret = MAMA_STATUS_NULL_ARG;

    if(NULL != subscription)

    {

        /* Get the impl. */

        mamaSubscriptionImpl *impl = (mamaSubscriptionImpl *)subscription;

 

        mamaSubscription_deactivate(subscription);

 

         wlock_lock(impl->mCreateDestroyLock);

 

        /* The next action will depend on the current state of the subscription. */

        switch(wInterlocked_read(&impl->mState))

        {

                /* Otherwise the subscription has been correctly removed from the throttle. */

                /* Fall through to perform the remaining clean-up. */

 

                /* For the following states the subscription is not active, simply perform clean-up. */

            case MAMA_SUBSCRIPTION_SETUP:

            case MAMA_SUBSCRIPTION_DEACTIVATED:

                 mamaSubscription_cleanup(subscription);

                 mamaSubscriptionImpl_setState(impl, MAMA_SUBSCRIPTION_DESTROYED);

                  wlock_unlock(impl->mCreateDestroyLock);

                 mamaSubscriptionImpl_invokeDestroyedCallback(subscription);

                 return MAMA_STATUS_OK;

                break;

 

mamaSubscriptionImpl_onSubscriptionDestroyed:3292+3303

 

void MAMACALLTYPE mamaSubscriptionImpl_onSubscriptionDestroyed(mamaSubscription subscription, void *closure)
{
    /* Obtain the impl from the subscription object. */
    mamaSubscriptionImpl *impl = (mamaSubscriptionImpl *)subscription;
    if(NULL != impl)
    {
 
        if(NULL != impl->mQueue)
            mamaQueue_decrementObjectCount(&impl->mLockHandle, impl->mQueue);
 
        /* Lock the mutex. */
        wlock_lock(impl->mCreateDestroyLock);
 
 
        /* The next action will depend on the current state of the subscription. */
        switch(wInterlocked_read(&impl->mState))
        {
                /* The subscription is being deactivated. */
            case MAMA_SUBSCRIPTION_DEACTIVATING:
                /* Change the state. */
                mamaSubscriptionImpl_setState(impl, MAMA_SUBSCRIPTION_DEACTIVATED);
                break;
 
                /* The subscription is being deallocated, i.e. mamaSubscription_deallocate has been called
                 * before the destroy callback has come in from the bridge.
                 */
            case MAMA_SUBSCRIPTION_DEALLOCATING :
                 mamaSubscription_cleanup(subscription);
                 wlock_unlock(impl->mCreateDestroyLock);
                 mamaSubscriptionImpl_invokeDestroyedCallback(impl);
                /* Delete the subscription. */
                mamaSubscriptionImpl_deallocate(impl);
                return;
                break;
 
                /* The subscription is being destroyed. */
            case MAMA_SUBSCRIPTION_DESTROYING :
                 mamaSubscription_cleanup(subscription);
                 mamaSubscriptionImpl_setState(impl, MAMA_SUBSCRIPTION_DESTROYED);
                  wlock_unlock(impl->mCreateDestroyLock);
                 mamaSubscriptionImpl_invokeDestroyedCallback(impl);
                 return;
                break;

This message is confidential and subject to terms at: https://www.jpmorgan.com/emaildisclaimer including on confidential, privileged or legal entity information, viruses and monitoring of electronic messages. If you are not the intended recipient, please delete this message and notify the sender immediately. Any unauthorized use is strictly prohibited.

Join Openmama-dev@lists.openmama.org to automatically receive all group messages.