mama_status avisTransportBridge_stop(avisTransportBridge* transportBridge) { CHECK_TRANSPORT(transportBridge); if (0 == wInterlocked_read (&transportBridge->mDispatching)) { mama_log (MAMA_LOG_LEVEL_WARN, "avisTransportBridge_stop(): " "Avis already stopped"); log_avis_error (MAMA_LOG_LEVEL_WARN, transportBridge->mAvis); return MAMA_STATUS_OK; } wInterlocked_set (0, &transportBridge->mDispatching); /* Dispatch a dummy notification to get the event polling to iterate * another loop and examine the mDispatching state */ elvin_invoke (transportBridge->mAvis, &closeNotification, transportBridge); while (-1 == wsem_wait(&transportBridge->mAvisDispatchSem)) { if (errno != EINTR) return MAMA_STATUS_SYSTEM_ERROR; } wthread_join (transportBridge->mThreadId, NULL); return MAMA_STATUS_OK; }
mama_status avisBridgeMamaSubscription_destroy (subscriptionBridge subscriber) { mama_status status = MAMA_STATUS_OK; wombatQueue queue = NULL; avisTransportBridge* avisTransport = NULL; CHECK_SUBSCRIBER(subscriber); mamaTransport_getBridgeTransport ( avisSub(subscriber)->mTransport, (void*) &avisTransport); if (!avisTransport) return MAMA_STATUS_INVALID_ARG; if (avisTransportBridge_isDispatching (avisTransport)) { elvin_invoke (avisSub(subscriber)->mAvis, &unsubscribeAvis, avisSub(subscriber)->mAvisSubscription); } else { unsubscribeAvis (avisSub(subscriber)->mAvis, avisSub(subscriber)->mAvisSubscription); } avisSub(subscriber)->mAvisSubscription = NULL; mamaQueue_getNativeHandle(avisSub(subscriber)->mQueue, &queue); if (!queue) { mama_log (MAMA_LOG_LEVEL_ERROR, "avisBridgeMamaSubscription_destroy(): " "Could not get event queue."); return MAMA_STATUS_PLATFORM; } avisSub(subscriber)->mMamaCallback.onDestroy ( avisSub(subscriber)->mMamaSubscription, avisSub(subscriber)->mClosure); wsem_destroy(&avisSub(subscriber)->mCreateDestroySem); free(avisSub(subscriber)->mSubject); free(avisSub(subscriber)); return status; }
mama_status avisBridgeMamaSubscription_create (subscriptionBridge* subscriber, const char* source, const char* symbol, mamaTransport transport, mamaQueue queue, mamaMsgCallbacks callback, mamaSubscription subscription, void* closure) { avisSubscription* impl = NULL; avisTransportBridge* avisTransport = NULL; if (!subscriber || !subscription || !transport ) return MAMA_STATUS_NULL_ARG; impl = (avisSubscription*)calloc (1, sizeof(avisSubscription)); if (impl == NULL) return MAMA_STATUS_NOMEM; impl->mAvis = getAvis(transport); if (!impl->mAvis) return MAMA_STATUS_INVALID_ARG; mamaTransport_getBridgeTransport ( transport, (void*) &avisTransport); if (!avisTransport) return MAMA_STATUS_INVALID_ARG; /* Use a standard centralized method to determine a topic key */ avisBridgeMamaSubscriptionImpl_generateSubjectKey (NULL, source, symbol, &impl->mSubject); impl->mMamaCallback = callback; impl->mMamaSubscription = subscription; impl->mQueue = queue; impl->mTransport = transport; impl->mClosure = closure; impl->mIsNotMuted = 1; impl->mIsValid = 1; impl->mAvisSubscription = NULL; wsem_init(&impl->mCreateDestroySem, 0, 0); *subscriber = (subscriptionBridge) impl; if (avisTransportBridge_isDispatching (avisTransport)) { elvin_invoke (impl->mAvis, &subscribeAvis, impl); wsem_wait (&impl->mCreateDestroySem); } else { subscribeAvis (impl->mAvis, impl); } return MAMA_STATUS_OK; }