mama_status mamaDispatcher_create (mamaDispatcher *result, mamaQueue queue) { mamaQueueImpl* qImpl = (mamaQueueImpl*)queue; mamaDispatcherImpl* impl = NULL; if (!queue) { mama_log (MAMA_LOG_LEVEL_WARN, "mamaDispatcher_create(): NULL queue."); return MAMA_STATUS_INVALID_ARG; } if (!result) { mama_log (MAMA_LOG_LEVEL_WARN, "mamaDispatcher_create(): Invalid " "address"); return MAMA_STATUS_NULL_ARG; } *result = NULL; /*A queue can only have a single dispatcher.*/ if (qImpl->mDispatcher) return MAMA_STATUS_TOO_MANY_DISPATCHERS; impl = (mamaDispatcherImpl*)calloc( 1, sizeof(mamaDispatcherImpl) ); if (impl == NULL) { mama_log (MAMA_LOG_LEVEL_ERROR, "mamaDispatcher_create(): Could not " "allocate dispatcher."); return MAMA_STATUS_NOMEM; } wInterlocked_initialize(&impl->mIsDispatching); wInterlocked_set(0, &impl->mIsDispatching); impl->mQueue = queue; if (wthread_create(&impl->mThread, NULL, dispatchThreadProc, impl)) { free (impl); mama_log (MAMA_LOG_LEVEL_ERROR, "mamaDispatcher_create(): Could not " "create dispatch thread."); return MAMA_STATUS_SYSTEM_ERROR; } qImpl->mDispatcher = (mamaDispatcher)impl; *result = (mamaDispatcher)impl; return MAMA_STATUS_OK; }
mama_status mamaQueue_create (mamaQueue* queue, mamaBridge bridgeImpl) { mama_status status = MAMA_STATUS_OK; mamaBridgeImpl* bImpl = (mamaBridgeImpl*)bridgeImpl; mamaQueueImpl* impl = NULL; if (!bridgeImpl) { mama_log (MAMA_LOG_LEVEL_ERROR, "mamaQueue_create(): NULL bridge."); return MAMA_STATUS_NO_BRIDGE_IMPL; } if (!queue) { mama_log (MAMA_LOG_LEVEL_ERROR, "mamaQueue_create(): NULL queue" " address."); return MAMA_STATUS_NULL_ARG; } /*Create the queue structure*/ impl = (mamaQueueImpl*)calloc (1, sizeof (mamaQueueImpl)); if (!impl) return MAMA_STATUS_NOMEM; impl->mBridgeImpl = bImpl; impl->mMamaQueueBridgeImpl = NULL; impl->mDispatcher = NULL; impl->mQueueName = strdup ("NO_NAME"); impl->mHighWatermark = 0; impl->mLowWatermark = 1; impl->mQueueMonitorCallbacks.onQueueHighWatermarkExceeded = NULL; impl->mQueueMonitorCallbacks.onQueueLowWatermark = NULL; impl->mQueueMonitorClosure = NULL; /* Create the counter lock. */ wInterlocked_initialize(&impl->mNumberOpenObjects); wInterlocked_set(0, &impl->mNumberOpenObjects); /* Call the bridge impl specific queue create function*/ if (MAMA_STATUS_OK!=(status=impl->mBridgeImpl->bridgeMamaQueueCreate (&(impl->mMamaQueueBridgeImpl), impl))) { mama_log (MAMA_LOG_LEVEL_ERROR, "Could not create queue bridge."); mamaQueue_destroy ((mamaQueue)impl); return status; } /* Determine if object lock tracking is enabled. */ { const char *propValue = mama_getProperty(MAMAQUEUE_PROPERTY_OBJECT_LOCK_TRACKING); /* Only do this if it's set. */ if(NULL != propValue) { impl->mTrackObjectLocks = strtobool(propValue); } } *queue = (mamaQueue)impl; mamaQueue_enableStats((mamaQueue)impl); return MAMA_STATUS_OK; }
mama_status avisBridgeMamaTransport_create (transportBridge* result, const char* name, mamaTransport mamaTport ) { mama_status status; avisBridgeImpl* avisBridge = NULL; avisTransportBridge* transport = NULL; mamaBridgeImpl* bridgeImpl = NULL; const char* url = NULL; transport = (avisTransportBridge*)calloc( 1, sizeof( avisTransportBridge ) ); if (transport == NULL) return MAMA_STATUS_NOMEM; transport->mTransport = (mamaTransport) mamaTport; bridgeImpl = mamaTransportImpl_getBridgeImpl(mamaTport); if (!bridgeImpl) { mama_log (MAMA_LOG_LEVEL_ERROR, "avisBridgeMamaTransport_create(): Could not get bridge"); free(transport); return MAMA_STATUS_PLATFORM; } status = mamaBridgeImpl_getClosure((mamaBridge) bridgeImpl, (void**) &avisBridge); if (MAMA_STATUS_OK != status) { mama_log (MAMA_LOG_LEVEL_ERROR, "avisBridgeMamaTransport_create(): Could not get Avis bridge object"); free(transport); return status; } /* create the Elvin object */ transport->mAvis = (Elvin*)calloc (1, sizeof (Elvin)); if (transport->mAvis == NULL) { mama_log (MAMA_LOG_LEVEL_ERROR, "avisBridge_createImpl(): Could not create Elvin object"); free(transport); return MAMA_STATUS_PLATFORM; } /* open the server connection */ url = getURL(name); if (url == NULL) { mama_log (MAMA_LOG_LEVEL_NORMAL, "No %s property defined for transport : %s", TPORT_PARAM, name); return MAMA_STATUS_INVALID_ARG; } if (!elvin_open(transport->mAvis, url)) { mama_log (MAMA_LOG_LEVEL_ERROR, "open failed for %s: %s", TPORT_PARAM, name); log_avis_error(MAMA_LOG_LEVEL_ERROR, transport->mAvis); avisBridgeMamaTransport_destroy((transportBridge)transport); return MAMA_STATUS_PLATFORM; } wInterlocked_initialize (&transport->mDispatching); elvin_add_close_listener(transport->mAvis, closeListener, transport); wsem_init(&transport->mAvisDispatchSem, 0, 0); *result = (transportBridge) transport; return avisTransportBridge_start(transport); }