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); }
Shader& Shader::operator = (const Shader& other) { _release(); _object = other._object; _refCount = other._refCount; _retain(); return *this; }
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); }
Shader::Shader(const Shader& other) : _object(other._object), _refCount(other._refCount) { _retain(); }