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; }
/* Description: Load the middleware bridge, initialize MAMA, begin * processing messages in a non-default thread, stop * processing on the non-default thread, close MAMA. * * Expected Result: MAMA_STATUS_OK */ TEST_F (MamaOpenCloseTestC, StartStopDifferentThreads) { mamaBridge bridge; ASSERT_EQ (MAMA_STATUS_OK, mama_loadBridge (&bridge, getMiddleware())); ASSERT_EQ (MAMA_STATUS_OK, mama_open()); /* Start mama in the background so it uses a different thread */ wsem_t sem; mamaQueue defaultQueue; ASSERT_EQ (0, wsem_init (&sem, 0, 0)); ASSERT_EQ (MAMA_STATUS_OK, mama_getDefaultEventQueue (bridge, &defaultQueue)); ASSERT_EQ (MAMA_STATUS_OK, mamaQueue_enqueueEvent (defaultQueue, onEventStop, bridge)); ASSERT_EQ (MAMA_STATUS_OK, mama_startBackgroundEx (bridge, startCallback, &sem)); ASSERT_EQ (0, wsem_wait (&sem)); ASSERT_EQ (MAMA_STATUS_OK, mama_close()); }
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; }