Ejemplo n.º 1
0
 mama_status
 tick42rmdsBridgeMamaSubscription_create (subscriptionBridge*  subscriber,
                                   const char*          source,
                                   const char*          symbol,
                                   mamaTransport        transport,
                                   mamaQueue            queue,
                                   mamaMsgCallbacks     callback,
                                   mamaSubscription     subscription,
                                   void*                closure)
 {
	 CHECK_SUBSCRIBER(subscriber);
	 mama_status status;

	 // get hold of the bridge implementation
	 mamaBridgeImpl* bridgeImpl = mamaTransportImpl_getBridgeImpl(transport);
	 if (!bridgeImpl) {
		 mama_log (MAMA_LOG_LEVEL_ERROR, "tick42rmdsBridgeMamaSubscription_create(): Could not get bridge");
		 return MAMA_STATUS_PLATFORM;
	 }

	 RMDSBridgeImpl*  upaBridge = NULL;
	 if (MAMA_STATUS_OK != (status = mamaBridgeImpl_getClosure((mamaBridge) bridgeImpl, (void**) &upaBridge))) 
	 {
		 mama_log (MAMA_LOG_LEVEL_ERROR, "tick42rmdsBridgeMamaSubscription_create(): Could not get UPA bridge object");
		 return status;
	 }

	 // actually lookup on the transport itself
	 RMDSSubscriber_ptr_t sub = upaBridge->getTransportBridge(transport)->Subscriber();
	 sub->AddSubscription(subscriber, source, symbol, transport, queue, callback, subscription, closure);


     return MAMA_STATUS_OK;
 }
Ejemplo n.º 2
0
mama_status
avisBridgeMamaTransport_destroy (transportBridge transport)
{
    mama_status status;
    avisTransportBridge* transportBridge = (avisTransportBridge*) transport;
    avisBridgeImpl*      avisBridge      = NULL;
    mamaBridgeImpl*      bridgeImpl      = NULL;
    
    bridgeImpl = mamaTransportImpl_getBridgeImpl(
        avisTransport(transport)->mTransport);
    if (!bridgeImpl) 
    {
        mama_log (MAMA_LOG_LEVEL_ERROR, 
            "avisBridgeMamaTransport_destroy(): 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_destroy(): Could not get Avis bridge object");
        free(transport);
        return status;
    }

    if (1 == wInterlocked_read (&transportBridge->mDispatching))
    {
        avisTransportBridge_stop (transportBridge);
    }

    elvin_remove_close_listener (transportBridge->mAvis, closeListener);

    if (!elvin_close (transportBridge->mAvis)) 
    {
        /* there appears to be a race condition in Avis libs where router socket
         * can sometimes be closed before we receive the disconnect reply -- log
         * it, and continue */
        log_avis_error(MAMA_LOG_LEVEL_FINE, transportBridge->mAvis);
    }

    wInterlocked_destroy (&transportBridge->mDispatching);
    wsem_destroy(&avisTransport(transport)->mAvisDispatchSem);
    free(avisTransport(transport)->mAvis);
    free(avisTransport(transport));
    return MAMA_STATUS_OK;
}
Ejemplo n.º 3
0
 mama_status
 tick42rmdsBridgeMamaSubscription_destroy (subscriptionBridge subscriber)
 {
	 CHECK_SUBSCRIBER(subscriber);

	 // Get the Bridge subscription object 
	 RMDSBridgeSubscription* pSubscription = RMDSBridgeSub(subscriber);

	 mama_status status;

	 // get hold of the bridge implementation
	 mamaBridgeImpl* bridgeImpl = mamaTransportImpl_getBridgeImpl(pSubscription->Transport());
	 if (!bridgeImpl) {
		 mama_log (MAMA_LOG_LEVEL_ERROR, "tick42rmdsBridgeMamaSubscription_destroy(): Could not get bridge");
		 return MAMA_STATUS_PLATFORM;
	 }

	 RMDSBridgeImpl*  upaBridge = NULL;
	 if (MAMA_STATUS_OK != (status = mamaBridgeImpl_getClosure((mamaBridge) bridgeImpl, (void**) &upaBridge))) 
	 {
		 mama_log (MAMA_LOG_LEVEL_ERROR, "tick42rmdsBridgeMamaSubscription_destroy(): Could not get UPA bridge object");
		 return status;
	 }

	 RMDSSubscriber_ptr_t sub = upaBridge->getTransportBridge(pSubscription->Transport())->Subscriber();

	 // grab stuff for onDestroyCB from our object before we kill it
	 void * closure = pSubscription->Closure();
	  wombat_subscriptionDestroyCB destroyCb = pSubscription->Callback().onDestroy;
	  mamaSubscription parent = pSubscription->Subscription();

	 sub->RemoveSubscription(pSubscription);

	     
     //Invoke the subscription callback to inform that the bridge has been
     //destroyed.
    if (NULL != destroyCb)
        (*(wombat_subscriptionDestroyCB)destroyCb)(parent, closure);

     return MAMA_STATUS_OK;
 }
Ejemplo n.º 4
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);
}