diff options
| author | David Blaikie <dblaikie@gmail.com> | 2019-02-05 23:38:55 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2019-02-05 23:38:55 +0000 |
| commit | e49209ed88395ef4ae0cf30fd2b547af68a9cae9 (patch) | |
| tree | 11b829b27c6bb8c20361cd3ce6dd97aab468aa1c /llvm/include | |
| parent | 520a37f52ff159636e25eb30178aa14f0499bddc (diff) | |
| download | bcm5719-llvm-e49209ed88395ef4ae0cf30fd2b547af68a9cae9.tar.gz bcm5719-llvm-e49209ed88395ef4ae0cf30fd2b547af68a9cae9.zip | |
Orc: Simplify RPC naming system by using function-local statics
The existing scheme of class template static members for Name and
NameMutex is a bit verbose, involves global ctors (even if they're cheap
for string and mutex, still not entirely free), and (importantly/my
immediate motivation here) trips over a bug in LLVM's modules
implementation that's a bit involved (hmm, sounds like Mr. Smith has a
fix for the modules thing - but I'm still inclined to commit this patch
as general goodness).
llvm-svn: 353241
Diffstat (limited to 'llvm/include')
| -rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h | 86 | ||||
| -rw-r--r-- | llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h | 16 |
2 files changed, 28 insertions, 74 deletions
diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h b/llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h index 9c18f3609ca..07c7471afc6 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/RPCSerialization.h @@ -127,123 +127,85 @@ template <typename T> class RPCTypeName<Expected<T>> { public: static const char* getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "Expected<" << RPCTypeNameSequence<T>() << ">"; + return Name; + }(); return Name.data(); } - -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename T> -std::mutex RPCTypeName<Expected<T>>::NameMutex; - -template <typename T> -std::string RPCTypeName<Expected<T>>::Name; - template <typename T1, typename T2> class RPCTypeName<std::pair<T1, T2>> { public: static const char* getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "std::pair<" << RPCTypeNameSequence<T1, T2>() << ">"; + return Name; + }(); return Name.data(); } -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename T1, typename T2> -std::mutex RPCTypeName<std::pair<T1, T2>>::NameMutex; -template <typename T1, typename T2> -std::string RPCTypeName<std::pair<T1, T2>>::Name; - template <typename... ArgTs> class RPCTypeName<std::tuple<ArgTs...>> { public: static const char* getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "std::tuple<" << RPCTypeNameSequence<ArgTs...>() << ">"; + return Name; + }(); return Name.data(); } -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename... ArgTs> -std::mutex RPCTypeName<std::tuple<ArgTs...>>::NameMutex; -template <typename... ArgTs> -std::string RPCTypeName<std::tuple<ArgTs...>>::Name; - template <typename T> class RPCTypeName<std::vector<T>> { public: static const char*getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "std::vector<" << RPCTypeName<T>::getName() << ">"; + return Name; + }(); return Name.data(); } - -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename T> -std::mutex RPCTypeName<std::vector<T>>::NameMutex; -template <typename T> -std::string RPCTypeName<std::vector<T>>::Name; - template <typename T> class RPCTypeName<std::set<T>> { public: static const char *getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "std::set<" << RPCTypeName<T>::getName() << ">"; + return Name; + }(); return Name.data(); } - -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename T> std::mutex RPCTypeName<std::set<T>>::NameMutex; -template <typename T> std::string RPCTypeName<std::set<T>>::Name; - template <typename K, typename V> class RPCTypeName<std::map<K, V>> { public: static const char *getName() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << "std::map<" << RPCTypeNameSequence<K, V>() << ">"; + return Name; + }(); return Name.data(); } - -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename K, typename V> -std::mutex RPCTypeName<std::map<K, V>>::NameMutex; -template <typename K, typename V> std::string RPCTypeName<std::map<K, V>>::Name; - /// The SerializationTraits<ChannelT, T> class describes how to serialize and /// deserialize an instance of type T to/from an abstract channel of type /// ChannelT. It also provides a representation of the type's name via the diff --git a/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h b/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h index 4f38fbc5ecd..a2b12dbb5a6 100644 --- a/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h +++ b/llvm/include/llvm/ExecutionEngine/Orc/RPCUtils.h @@ -151,25 +151,17 @@ public: /// Returns the full function prototype as a string. static const char *getPrototype() { - std::lock_guard<std::mutex> Lock(NameMutex); - if (Name.empty()) + static std::string Name = [] { + std::string Name; raw_string_ostream(Name) << RPCTypeName<RetT>::getName() << " " << DerivedFunc::getName() << "(" << llvm::orc::rpc::RPCTypeNameSequence<ArgTs...>() << ")"; + return Name; + }(); return Name.data(); } - -private: - static std::mutex NameMutex; - static std::string Name; }; -template <typename DerivedFunc, typename RetT, typename... ArgTs> -std::mutex Function<DerivedFunc, RetT(ArgTs...)>::NameMutex; - -template <typename DerivedFunc, typename RetT, typename... ArgTs> -std::string Function<DerivedFunc, RetT(ArgTs...)>::Name; - /// Allocates RPC function ids during autonegotiation. /// Specializations of this class must provide four members: /// |

