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;