void Redox::connectedCallback(const redisAsyncContext *ctx, int status) { Redox *rdx = (Redox *)ctx->data; if (status != REDIS_OK) { rdx->logger_.fatal() << "Could not connect to Redis: " << ctx->errstr; rdx->logger_.fatal() << "Status: " << status; unique_lock<mutex> lk(rdx->connect_lock_); rdx->connect_state_ = CONNECT_ERROR; } else { rdx->logger_.info() << "Connected to Redis."; unique_lock<mutex> lk(rdx->connect_lock_); // Disable hiredis automatically freeing reply objects ctx->c.reader->fn->freeObject = [](void *reply) {}; rdx->connect_state_ = CONNECTED; } int state; { unique_lock<mutex> lk(rdx->connect_lock_); state = rdx->connect_state_; } rdx->connect_waiter_.notify_all(); if (rdx->user_connection_callback_) rdx->user_connection_callback_(state); }
void Redox::disconnectedCallback(const redisAsyncContext *ctx, int status) { Redox *rdx = (Redox *)ctx->data; if (status != REDIS_OK) { rdx->logger_.error() << "Disconnected from Redis on error: " << ctx->errstr; unique_lock<mutex> lk(rdx->connect_lock_); rdx->connect_state_ = DISCONNECT_ERROR; } else { rdx->logger_.info() << "Disconnected from Redis as planned."; unique_lock<mutex> lk(rdx->connect_lock_); rdx->connect_state_ = DISCONNECTED; } rdx->stop(); int state; { unique_lock<mutex> lk(rdx->connect_lock_); state = rdx->connect_state_; } rdx->connect_waiter_.notify_all(); if (rdx->user_connection_callback_) rdx->user_connection_callback_(state); }