mama_status avisTransportBridge_start(avisTransportBridge* transportBridge) { /* stop Avis event loop */ int rc; CHECK_TRANSPORT(transportBridge); if (1 == wInterlocked_read (&transportBridge->mDispatching)) { mama_log (MAMA_LOG_LEVEL_WARN, "avisTransportBridge_start(): " "Avis already dispatching"); log_avis_error (MAMA_LOG_LEVEL_WARN, transportBridge->mAvis); return MAMA_STATUS_OK; } wInterlocked_set (1, &transportBridge->mDispatching); rc = wthread_create (&transportBridge->mThreadId, NULL, avisDispatchThread, transportBridge); if (0 != rc) { mama_log (MAMA_LOG_LEVEL_ERROR, "wthread_create returned %d", rc); return MAMA_STATUS_SYSTEM_ERROR; } return MAMA_STATUS_OK; }
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 avisBridgeMamaTransport_getNativeTransport (transportBridge transport, void** result) { CHECK_TRANSPORT(transport); *result = avisTransport(transport); return MAMA_STATUS_OK; }
int avisTransportBridge_isDispatching ( avisTransportBridge* transportBridge) { CHECK_TRANSPORT(transportBridge); return wInterlocked_read (&transportBridge->mDispatching); }
enum ChannelSourceType GetChannelProtocol(const char *url) { char *prefix[] = CHANNEL_SOURCE_PREFIXES; assert(url != NULL); CHECK_TRANSPORT(ChannelIPC); CHECK_TRANSPORT(ChannelTCP); CHECK_TRANSPORT(ChannelINPROC); CHECK_TRANSPORT(ChannelPGM); CHECK_TRANSPORT(ChannelEPGM); CHECK_TRANSPORT(ChannelUDP); return ChannelSourceTypeNumber; }