| //===-- UserIDResolver.h ----------------------------------------*- C++ -*-===// |
| // |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. |
| // See https://llvm.org/LICENSE.txt for license information. |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLDB_UTILITY_USERIDRESOLVER_H |
| #define LLDB_UTILITY_USERIDRESOLVER_H |
| |
| #include "llvm/ADT/DenseMap.h" |
| #include "llvm/ADT/StringRef.h" |
| #include <mutex> |
| |
| namespace lldb_private { |
| |
| /// An abstract interface for things that know how to map numeric user/group IDs |
| /// into names. It caches the resolved names to avoid repeating expensive |
| /// queries. The cache is internally protected by a mutex, so concurrent queries |
| /// are safe. |
| class UserIDResolver { |
| public: |
| typedef uint32_t id_t; |
| virtual ~UserIDResolver(); // anchor |
| |
| llvm::Optional<llvm::StringRef> GetUserName(id_t uid) { |
| return Get(uid, m_uid_cache, &UserIDResolver::DoGetUserName); |
| } |
| llvm::Optional<llvm::StringRef> GetGroupName(id_t gid) { |
| return Get(gid, m_gid_cache, &UserIDResolver::DoGetGroupName); |
| } |
| |
| /// Returns a resolver which returns a failure value for each query. Useful as |
| /// a fallback value for the case when we know all lookups will fail. |
| static UserIDResolver &GetNoopResolver(); |
| |
| protected: |
| virtual llvm::Optional<std::string> DoGetUserName(id_t uid) = 0; |
| virtual llvm::Optional<std::string> DoGetGroupName(id_t gid) = 0; |
| |
| private: |
| using Map = llvm::DenseMap<id_t, llvm::Optional<std::string>>; |
| |
| llvm::Optional<llvm::StringRef> |
| Get(id_t id, Map &cache, |
| llvm::Optional<std::string> (UserIDResolver::*do_get)(id_t)); |
| |
| std::mutex m_mutex; |
| Map m_uid_cache; |
| Map m_gid_cache; |
| }; |
| |
| } // namespace lldb_private |
| |
| #endif // LLDB_UTILITY_USERIDRESOLVER_H |