xref: /src/contrib/llvm-project/lldb/source/Utility/UserIDResolver.cpp (revision bdd1243df58e60e85101c09001d9812a789b6bc4)
1cfca06d7SDimitry Andric //===-- UserIDResolver.cpp ------------------------------------------------===//
25f29bb8aSDimitry Andric //
35f29bb8aSDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
45f29bb8aSDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
55f29bb8aSDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
65f29bb8aSDimitry Andric //
75f29bb8aSDimitry Andric //===----------------------------------------------------------------------===//
85f29bb8aSDimitry Andric 
95f29bb8aSDimitry Andric #include "lldb/Utility/UserIDResolver.h"
105f29bb8aSDimitry Andric #include "llvm/Support/ManagedStatic.h"
11e3b55780SDimitry Andric #include <optional>
125f29bb8aSDimitry Andric 
135f29bb8aSDimitry Andric using namespace lldb_private;
145f29bb8aSDimitry Andric 
155f29bb8aSDimitry Andric UserIDResolver::~UserIDResolver() = default;
165f29bb8aSDimitry Andric 
Get(id_t id,Map & cache,std::optional<std::string> (UserIDResolver::* do_get)(id_t))17e3b55780SDimitry Andric std::optional<llvm::StringRef> UserIDResolver::Get(
185f29bb8aSDimitry Andric     id_t id, Map &cache,
19e3b55780SDimitry Andric     std::optional<std::string> (UserIDResolver::*do_get)(id_t)) {
205f29bb8aSDimitry Andric 
215f29bb8aSDimitry Andric   std::lock_guard<std::mutex> guard(m_mutex);
22e3b55780SDimitry Andric   auto iter_bool = cache.try_emplace(id, std::nullopt);
235f29bb8aSDimitry Andric   if (iter_bool.second)
245f29bb8aSDimitry Andric     iter_bool.first->second = (this->*do_get)(id);
255f29bb8aSDimitry Andric   if (iter_bool.first->second)
265f29bb8aSDimitry Andric     return llvm::StringRef(*iter_bool.first->second);
27e3b55780SDimitry Andric   return std::nullopt;
285f29bb8aSDimitry Andric }
295f29bb8aSDimitry Andric 
305f29bb8aSDimitry Andric namespace {
315f29bb8aSDimitry Andric class NoopResolver : public UserIDResolver {
325f29bb8aSDimitry Andric protected:
DoGetUserName(id_t uid)33e3b55780SDimitry Andric   std::optional<std::string> DoGetUserName(id_t uid) override {
34e3b55780SDimitry Andric     return std::nullopt;
355f29bb8aSDimitry Andric   }
365f29bb8aSDimitry Andric 
DoGetGroupName(id_t gid)37e3b55780SDimitry Andric   std::optional<std::string> DoGetGroupName(id_t gid) override {
38e3b55780SDimitry Andric     return std::nullopt;
395f29bb8aSDimitry Andric   }
405f29bb8aSDimitry Andric };
415f29bb8aSDimitry Andric } // namespace
425f29bb8aSDimitry Andric 
435f29bb8aSDimitry Andric static llvm::ManagedStatic<NoopResolver> g_noop_resolver;
445f29bb8aSDimitry Andric 
GetNoopResolver()455f29bb8aSDimitry Andric UserIDResolver &UserIDResolver::GetNoopResolver() { return *g_noop_resolver; }
46