aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorAdam Cozzette <acozzette@gmail.com>2018-06-18 11:38:06 -0700
committerGitHub <noreply@github.com>2018-06-18 11:38:06 -0700
commit885be9c9828514595f2f1d24c45aec620b739730 (patch)
tree090287264d31e390bfe5475f87965148c38bdeaf
parentb0a8220e92ce7eaccb3042efa123e17b4d0719e9 (diff)
downloadprotobuf-885be9c9828514595f2f1d24c45aec620b739730.tar.gz
protobuf-885be9c9828514595f2f1d24c45aec620b739730.tar.bz2
protobuf-885be9c9828514595f2f1d24c45aec620b739730.zip
Work around MSVC issue with std::atomic initialization (#4777)
* Work around MSVC issue with std::atomic initialization MSVC seems to have a bug where it does not use constant initialization for std::atomic, which ends up causing crashes during initialization. This change introduces a workaround by putting the std::atomic inside a union, which causes the compiler to use constant initialization for it. * Added an AppVeyor test for static linking with MSVC
-rw-r--r--appveyor.yml8
-rw-r--r--src/google/protobuf/generated_message_util.h9
2 files changed, 14 insertions, 3 deletions
diff --git a/appveyor.yml b/appveyor.yml
index 02e0d313..9644e066 100644
--- a/appveyor.yml
+++ b/appveyor.yml
@@ -1,6 +1,3 @@
-# Only test one combination: "Visual Studio 12 + Win64 + Debug + DLL". We can
-# test more combinations but AppVeyor just takes too long to finish (each
-# combination takes ~15mins).
platform:
- Win64
@@ -14,6 +11,11 @@ environment:
BUILD_DLL: ON
UNICODE: ON
+ - language: cpp
+ image: Visual Studio 2017
+ BUILD_DLL: OFF
+ UNICODE: ON
+
- language: csharp
image: Visual Studio 2017
diff --git a/src/google/protobuf/generated_message_util.h b/src/google/protobuf/generated_message_util.h
index c26e3e52..706df383 100644
--- a/src/google/protobuf/generated_message_util.h
+++ b/src/google/protobuf/generated_message_util.h
@@ -335,7 +335,16 @@ struct LIBPROTOBUF_EXPORT SCCInfoBase {
kRunning = 1,
kUninitialized = -1, // initial state
};
+#ifndef _MSC_VER
std::atomic<int> visit_status;
+#else
+ // MSVC doesnt make std::atomic constant initialized. This union trick
+ // makes it so.
+ union {
+ int visit_status_to_make_linker_init;
+ std::atomic<int> visit_status;
+ };
+#endif
int num_deps;
void (*init_func)();
// This is followed by an array of num_deps