void Stats::processMsg()

in src/oomd/Stats.cpp [167:228]


void Stats::processMsg(int sockfd) {
  std::array<char, 64> err_buf = {};
  OOMD_SCOPE_EXIT {
    if (::close(sockfd) < 0) {
      OLOG << "Stats server error: closing file descriptor: "
           << ::strerror_r(errno, err_buf.data(), err_buf.size());
    }
  };
  char mode = 'a';
  char byte_buf;
  int num_read = 0;
  for (; num_read < 32; num_read++) {
    int res = ::read(sockfd, &byte_buf, 1);
    if (res < 0) { // Error reading
      OLOG << "Stats server error: reading from socket: "
           << ::strerror_r(errno, err_buf.data(), err_buf.size());
      return;
    } else if (res == 0) { // EOF reached
      break;
    }
    // We read a char
    if (byte_buf == '\n' || byte_buf == '\0') {
      break;
    }
    if (num_read == 0) { // We only care about the first char
      mode = byte_buf;
    }
  }

  if (num_read == 0) {
    OLOG << "Stats server error: no msg received";
  }

  Json::Value root;
  root["error"] = 0;
  Json::Value body(Json::objectValue);
  switch (mode) {
    case 'g':
      for (auto const& pair : getAll()) {
        body[pair.first] = pair.second;
      }
      break;
    case 'r':
      Stats::reset();
      break;
    case '0':
      break;
    default:
      root["error"] = 1;
      OLOG << "Stats server error: received unknown request: " << mode;
  }
  root["body"] = body;
  std::string ret = root.toStyledString();
  if (Util::writeFull(sockfd, ret.c_str(), strlen(ret.c_str())) < 0) {
    OLOG << "Stats server error: writing to socket: "
         << ::strerror_r(errno, err_buf.data(), err_buf.size());
  }
  std::unique_lock<std::mutex> lock(thread_mutex_);
  thread_count_--;
  lock.unlock();
  thread_exited_.notify_one();
}