Ejemplo n.º 1
0
static natsStatus
_unsubscribe(natsSubscription *sub, int max)
{
    natsStatus      s   = NATS_OK;
    natsConnection  *nc = NULL;

    if (sub == NULL)
        return nats_setDefaultError(NATS_INVALID_ARG);

    natsSub_Lock(sub);

    if (sub->connClosed)
        s = NATS_CONNECTION_CLOSED;
    else if (sub->closed)
        s = NATS_INVALID_SUBSCRIPTION;

    if (s != NATS_OK)
    {
        natsSub_Unlock(sub);
        return nats_setDefaultError(s);
    }

    nc = sub->conn;
    _retain(sub);

    natsSub_Unlock(sub);

    s = natsConn_unsubscribe(nc, sub, max);

    natsSub_release(sub);

    return NATS_UPDATE_ERR_STACK(s);
}
Ejemplo n.º 2
0
Shader& Shader::operator = (const Shader& other) {
    _release();
    _object = other._object;
    _refCount = other._refCount;
    _retain();
    return *this;
}
Ejemplo n.º 3
0
natsStatus
natsSub_create(natsSubscription **newSub, natsConnection *nc, const char *subj,
               const char *queueGroup, natsMsgHandler cb, void *cbClosure,
               bool noDelay)
{
    natsStatus          s = NATS_OK;
    natsSubscription    *sub = NULL;

    sub = (natsSubscription*) NATS_CALLOC(1, sizeof(natsSubscription));
    if (sub == NULL)
        return nats_setDefaultError(NATS_NO_MEMORY);

    s = natsMutex_Create(&(sub->mu));
    if (s != NATS_OK)
    {
        NATS_FREE(sub);
        return NATS_UPDATE_ERR_STACK(s);
    }

    natsConn_retain(nc);

    sub->refs           = 1;
    sub->conn           = nc;
    sub->msgCb          = cb;
    sub->msgCbClosure   = cbClosure;
    sub->noDelay        = noDelay;
    sub->msgsLimit      = nc->opts->maxPendingMsgs;
    sub->bytesLimit     = nc->opts->maxPendingMsgs * 1024;
    sub->signalLimit    = (int)(sub->msgsLimit * 0.75);

    sub->subject = NATS_STRDUP(subj);
    if (sub->subject == NULL)
        s = nats_setDefaultError(NATS_NO_MEMORY);

    if ((s == NATS_OK) && (queueGroup != NULL) && (strlen(queueGroup) > 0))
    {
        sub->queue = NATS_STRDUP(queueGroup);
        if (sub->queue == NULL)
            s = nats_setDefaultError(NATS_NO_MEMORY);
    }
    if (s == NATS_OK)
        s = natsCondition_Create(&(sub->cond));
    if ((s == NATS_OK) && !(sub->noDelay))
    {
        // Set the interval to any value, really, it will get reset to
        // a smaller value when the delivery thread should be signaled.
        sub->signalTimerInterval = 10000;

        // Let's not rely on the created timer acquiring the lock that
        // would make it safe to retain only on success.
        _retain(sub);

        s = natsTimer_Create(&(sub->signalTimer),
                             _signalMsgAvailable,
                             _signalTimerStopped,
                             sub->signalTimerInterval, (void*) sub);
        if (s != NATS_OK)
            _release(sub);
    }
    if ((s == NATS_OK) && (cb != NULL))
    {
        // Let's not rely on the created thread acquiring the lock that
        // would make it safe to retain only on success.
        _retain(sub);

        // If we have an async callback, start up a sub specific
        // thread to deliver the messages.
        s = natsThread_Create(&(sub->deliverMsgsThread), natsSub_deliverMsgs,
                              (void*) sub);
        if (s != NATS_OK)
            _release(sub);
    }

    if (s == NATS_OK)
        *newSub = sub;
    else
        natsSub_release(sub);

    return NATS_UPDATE_ERR_STACK(s);
}
Ejemplo n.º 4
0
Shader::Shader(const Shader& other) :
    _object(other._object),
    _refCount(other._refCount)
{
    _retain();
}