natsStatus natsThreadLocal_CreateKey(natsThreadLocal *tl, void (*destructor)(void*)) { int ret; if ((ret = pthread_key_create(tl, destructor)) != 0) { return nats_setError(NATS_SYS_ERROR, "pthread_key_create error: %d", ret); } return NATS_OK; }
natsStatus natsThreadLocal_SetEx(natsThreadLocal tl, const void *value, bool setErr) { int ret; if ((ret = pthread_setspecific(tl, value)) != 0) { return nats_setError(NATS_SYS_ERROR, "pthread_setspecific: %d", ret); } return NATS_OK; }
natsStatus natsThread_Create(natsThread **thread, natsThreadCb cb, void *arg) { struct threadCtx *ctx = NULL; natsThread *t = NULL; natsStatus s = NATS_OK; int err; ctx = (struct threadCtx*) NATS_CALLOC(1, sizeof(*ctx)); t = (natsThread*) NATS_CALLOC(1, sizeof(natsThread)); if ((ctx == NULL) || (t == NULL)) s = nats_setDefaultError(NATS_NO_MEMORY); if (s == NATS_OK) { ctx->entry = cb; ctx->arg = arg; err = pthread_create(t, NULL, _threadStart, ctx); if (err) s = nats_setError(NATS_SYS_ERROR, "pthread_create error: %d", errno); } if (s == NATS_OK) { *thread = t; } else { NATS_FREE(ctx); NATS_FREE(t); } return s; }
natsStatus natsSubscription_SetPendingLimits(natsSubscription *sub, int msgLimit, int bytesLimit) { if (sub == NULL) return nats_setDefaultError(NATS_INVALID_ARG); if ((msgLimit < 0) || (bytesLimit < 0)) return nats_setError(NATS_INVALID_ARG, "%s", "Limits must be positive numbers"); natsSub_Lock(sub); if (sub->closed) { natsSub_Unlock(sub); return nats_setDefaultError(NATS_INVALID_SUBSCRIPTION); } sub->msgsLimit = msgLimit; sub->bytesLimit = bytesLimit; natsSub_Unlock(sub); return NATS_OK; }