Exemplo n.º 1
0
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;
}      
Exemplo n.º 2
0
mama_status
avisBridgeMamaSubscription_destroy (subscriptionBridge subscriber)
{
    mama_status          status        = MAMA_STATUS_OK;
    wombatQueue          queue         = NULL;
    avisTransportBridge* avisTransport = NULL;

    CHECK_SUBSCRIBER(subscriber);

    mamaTransport_getBridgeTransport (
        avisSub(subscriber)->mTransport, (void*) &avisTransport);

    if (!avisTransport)
        return MAMA_STATUS_INVALID_ARG;

    if (avisTransportBridge_isDispatching (avisTransport))
    {
        elvin_invoke (avisSub(subscriber)->mAvis, &unsubscribeAvis, 
                      avisSub(subscriber)->mAvisSubscription);
    }
    else
    {
        unsubscribeAvis (avisSub(subscriber)->mAvis,
                         avisSub(subscriber)->mAvisSubscription);
    }

    avisSub(subscriber)->mAvisSubscription = NULL;
    
    mamaQueue_getNativeHandle(avisSub(subscriber)->mQueue, &queue);

    if (!queue)
    {
        mama_log (MAMA_LOG_LEVEL_ERROR, "avisBridgeMamaSubscription_destroy(): "
                  "Could not get event queue.");
        return MAMA_STATUS_PLATFORM;
    }
                            
    avisSub(subscriber)->mMamaCallback.onDestroy (
        avisSub(subscriber)->mMamaSubscription, 
        avisSub(subscriber)->mClosure);

    wsem_destroy(&avisSub(subscriber)->mCreateDestroySem);

    free(avisSub(subscriber)->mSubject);
    free(avisSub(subscriber));

    return status;
}
Exemplo n.º 3
0
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;
}