diff options
author | Peter Kasting <pkasting@chromium.org> | 2022-05-13 20:07:56 +0300 |
---|---|---|
committer | Milo Yip <miloyip@gmail.com> | 2022-05-19 06:55:17 +0300 |
commit | 781a4e667d84aeedbeb8184b7b62425ea66ec59f (patch) | |
tree | df7366b45a116a41adad893667e50fc533a331ab | |
parent | 88f8ddd70cebd8b0e7728467ac3958ad2a4c2cf1 (diff) |
Try to fix MSVC build.
-rw-r--r-- | include/rapidjson/document.h | 36 |
1 files changed, 18 insertions, 18 deletions
diff --git a/include/rapidjson/document.h b/include/rapidjson/document.h index a72a04f8..0c4c229e 100644 --- a/include/rapidjson/document.h +++ b/include/rapidjson/document.h @@ -1230,29 +1230,29 @@ public: 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]; } |