예제 #1
0
파일: client.cpp 프로젝트: bdallas/redox
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);
}
예제 #2
0
파일: client.cpp 프로젝트: bdallas/redox
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);
}