[go: nahoru, domu]

Skip to content

Commit

Permalink
Try to fix MSVC build.
Browse files Browse the repository at this point in the history
  • Loading branch information
pkasting authored and miloyip committed May 19, 2022
1 parent 88f8ddd commit 781a4e6
Showing 1 changed file with 18 additions and 18 deletions.
36 changes: 18 additions & 18 deletions include/rapidjson/document.h
Original file line number Diff line number Diff line change
Expand Up @@ -1230,29 +1230,29 @@ class GenericValue {
else {
RAPIDJSON_ASSERT(false); // see above note

// Use thread-local storage to prevent races between threads.
#if defined(_MSC_VER) && _MSC_VER < 1900
// MSVC 2013 or earlier does not support `thread_local` attribute even in C++11
// mode.
#define RAPIDJSON_THREAD_LOCAL __declspec(thread)
#elif RAPIDJSON_HAS_CXX11
#define RAPIDJSON_THREAD_LOCAL thread_local
#elif defined(__GNUC__) || defined(__clang__)
#define RAPIDJSON_THREAD_LOCAL __thread
#else
#define RAPIDJSON_THREAD_LOCAL
#endif

#if RAPIDJSON_HAS_CXX11
// Use static buffer and placement-new to prevent destruction.
alignas(GenericValue) RAPIDJSON_THREAD_LOCAL static char buffer[sizeof(GenericValue)];
// Use thread-local storage to prevent races between threads.
// Use static buffer and placement-new to prevent destruction, with
// alignas() to ensure proper alignment.
alignas(GenericValue) thread_local static char buffer[sizeof(GenericValue)];
return *new (buffer) GenericValue();
#elif defined(_MSC_VER) && _MSC_VER < 1900
// There's no way to solve both thread locality and proper alignment
// simultaneously.
__declspec(thread) static char buffer[sizeof(GenericValue)];
return *new (buffer) GenericValue();
#elif defined(__GNUC__) || defined(__clang__)
// This will generate -Wexit-time-destructors in clang, but that's
// better than having under-alignment.
__thread static GenericValue buffer;
return buffer;
#else
// This will generate -Wexit-time-destructors in clang.
RAPIDJSON_THREAD_LOCAL static GenericValue buffer;
// Don't know what compiler this is, so don't know how to ensure
// thread-locality.
static GenericValue buffer;
return buffer;
#endif
}
}
}
template <typename SourceAllocator>
const GenericValue& operator[](const GenericValue<Encoding, SourceAllocator>& name) const { return const_cast<GenericValue&>(*this)[name]; }
Expand Down

0 comments on commit 781a4e6

Please sign in to comment.