Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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;
}
Exemplo n.º 3
0
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);
}