/* * Copyright (C) 2021 The Android Open Source Project * * 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 "host/libs/confui/host_utils.h" namespace cuttlefish { namespace confui { namespace thread { std::string ThreadTracer::Get(const std::thread::id tid) { std::lock_guard lock(mtx_); if (id2name_.find(tid) != id2name_.end()) { return id2name_[tid]; } std::stringstream ss; ss << "Thread@" << tid; return ss.str(); } void ThreadTracer::Set(const std::string& name, const std::thread::id tid) { std::lock_guard lock(mtx_); if (name2id_.find(name) != name2id_.end()) { // has the name already if (name2id_[name] != tid) { // used for another thread ConfUiLog(FATAL) << "Thread name is duplicated."; } // name and id are already set correctly return; } if (id2name_.find(tid) != id2name_.end()) { // tid exists but has a different name name2id_.erase(id2name_[tid]); // delete old_name -> tid map } id2name_[tid] = name; name2id_[name] = tid; return; } std::optional ThreadTracer::Get(const std::string& name) { std::lock_guard lock(mtx_); if (name2id_.find(name) != name2id_.end()) { return {name2id_[name]}; } return std::nullopt; // unknown } ThreadTracer& GetThreadTracer() { static ThreadTracer thread_tracer; return thread_tracer; } std::string GetName(const std::thread::id tid) { return GetThreadTracer().Get(tid); } std::optional GetId(const std::string& name) { return GetThreadTracer().Get(name); } void Set(const std::string& name, const std::thread::id tid) { GetThreadTracer().Set(name, tid); } } // namespace thread } // namespace confui } // namespace cuttlefish