Make the following functions thread-safe but having them return an std::string that is reconstructed

every time they are called:

getClangRevision()
getClangFullRepositoryVersion()
getClangFullVersion()

llvm-svn: 96033
This commit is contained in:
Ted Kremenek 2010-02-12 22:54:40 +00:00
parent 29a9103ee6
commit a3e657064b
4 changed files with 26 additions and 33 deletions

View File

@ -1638,7 +1638,7 @@ void clang_disposeCodeCompleteResults(CXCodeCompleteResults *Results);
* \brief Return a version string, suitable for showing to a user, but not
* intended to be parsed (the format is not guaranteed to be stable).
*/
CINDEX_LINKAGE const char *clang_getClangVersion();
CINDEX_LINKAGE CXString clang_getClangVersion();
/**
* \brief Return a version string, suitable for showing to a user, but not

View File

@ -56,16 +56,16 @@ namespace clang {
/// \brief Retrieves the repository revision number (or identifer) from which
/// this Clang was built.
llvm::StringRef getClangRevision();
std::string getClangRevision();
/// \brief Retrieves the full repository version that is an amalgamation of
/// the information in getClangRepositoryPath() and getClangRevision().
llvm::StringRef getClangFullRepositoryVersion();
std::string getClangFullRepositoryVersion();
/// \brief Retrieves a string representing the complete clang version,
/// which includes the clang version number, the repository version,
/// and the vendor tag.
const char *getClangFullVersion();
std::string getClangFullVersion();
}
#endif // LLVM_CLANG_BASIC_VERSION_H

View File

@ -39,44 +39,37 @@ llvm::StringRef getClangRepositoryPath() {
return llvm::StringRef(URL, URLEnd - URL);
}
llvm::StringRef getClangRevision() {
std::string getClangRevision() {
#ifndef SVN_REVISION
// Subversion was not available at build time?
return llvm::StringRef();
return "";
#else
static std::string revision;
if (revision.empty()) {
llvm::raw_string_ostream OS(revision);
OS << strtol(SVN_REVISION, 0, 10);
}
std::string revision;
llvm::raw_string_ostream OS(revision);
OS << strtol(SVN_REVISION, 0, 10);
return revision;
#endif
}
llvm::StringRef getClangFullRepositoryVersion() {
static std::string buf;
if (buf.empty()) {
llvm::raw_string_ostream OS(buf);
OS << getClangRepositoryPath();
llvm::StringRef Revision = getClangRevision();
if (!Revision.empty())
OS << ' ' << Revision;
}
std::string getClangFullRepositoryVersion() {
std::string buf;
llvm::raw_string_ostream OS(buf);
OS << getClangRepositoryPath();
llvm::StringRef Revision = getClangRevision();
if (!Revision.empty())
OS << ' ' << Revision;
return buf;
}
const char *getClangFullVersion() {
static std::string buf;
if (buf.empty()) {
llvm::raw_string_ostream OS(buf);
std::string getClangFullVersion() {
std::string buf;
llvm::raw_string_ostream OS(buf);
#ifdef CLANG_VENDOR
OS << CLANG_VENDOR;
OS << CLANG_VENDOR;
#endif
OS << "clang version " CLANG_VERSION_STRING " ("
<< getClangFullRepositoryVersion() << ')';
}
return buf.c_str();
OS << "clang version " CLANG_VERSION_STRING " ("
<< getClangFullRepositoryVersion() << ')';
return buf;
}
} // end namespace clang

View File

@ -2169,8 +2169,8 @@ void clang_disposeString(CXString string) {
extern "C" {
const char *clang_getClangVersion() {
return getClangFullVersion();
CXString clang_getClangVersion() {
return CIndexer::createCXString(getClangFullVersion(), true);
}
} // end: extern "C"