// Copyright 2015 The Crashpad Authors. All rights reserved.
//
// Licensed under the Apache License, Version 2.0 (the "License");
// you may not use this file except in compliance with the License.
// You may obtain a copy of the License at
//
//     http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.

#include "util/thread/thread_log_messages.h"

#include <sys/types.h>

#include "base/check_op.h"
#include "base/logging.h"
#include "base/threading/thread_local_storage.h"

namespace crashpad {

namespace {

// While an object of this class exists, it will be set as the log message
// handler. A thread may register its thread-specific log message list to
// receive messages produced just on that thread.
//
// Only one object of this class may exist in the program at a time as created
// by GetInstance(). There must not be any log message handler in effect when it
// is created, and nothing else can be set as a log message handler while an
// object of this class exists.
class ThreadLogMessagesMaster {
 public:
  ThreadLogMessagesMaster(const ThreadLogMessagesMaster&) = delete;
  ThreadLogMessagesMaster& operator=(const ThreadLogMessagesMaster&) = delete;

  void SetThreadMessageList(std::vector<std::string>* message_list) {
    DCHECK_EQ(logging::GetLogMessageHandler(), &LogMessageHandler);
    DCHECK_NE(tls_.Get() != nullptr, message_list != nullptr);
    tls_.Set(message_list);
  }

  static ThreadLogMessagesMaster* GetInstance() {
    static auto master = new ThreadLogMessagesMaster();
    return master;
  }

 private:
  ThreadLogMessagesMaster() {
    DCHECK(!logging::GetLogMessageHandler());
    logging::SetLogMessageHandler(LogMessageHandler);
  }

  ~ThreadLogMessagesMaster() = delete;

  static bool LogMessageHandler(logging::LogSeverity severity,
                                const char* file_path,
                                int line,
                                size_t message_start,
                                const std::string& string) {
    std::vector<std::string>* log_messages =
        reinterpret_cast<std::vector<std::string>*>(GetInstance()->tls_.Get());
    if (log_messages) {
      log_messages->push_back(string);
    }

    // Don’t consume the message. Allow it to be logged as if nothing was set as
    // the log message handler.
    return false;
  }

  base::ThreadLocalStorage::Slot tls_;
};

}  // namespace

ThreadLogMessages::ThreadLogMessages() : log_messages_() {
  ThreadLogMessagesMaster::GetInstance()->SetThreadMessageList(&log_messages_);
}

ThreadLogMessages::~ThreadLogMessages() {
  ThreadLogMessagesMaster::GetInstance()->SetThreadMessageList(nullptr);
}

}  // namespace crashpad
