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
This commit is contained in:
parent
520a37f52f
commit
e49209ed88
|
@ -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
|
||||
|
|
|
@ -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:
|
||||
///
|
||||
|
|
Loading…
Reference in New Issue