Implement folly::launder for MSVC
authorAndrew Krieger <andrew.krieger@oculus.com>
Tue, 29 Aug 2017 05:30:39 +0000 (22:30 -0700)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 29 Aug 2017 05:38:50 +0000 (22:38 -0700)
Summary:
This implementation should suffice for MSVC. _ReadWriteBarrier()
generates no instructions but instructs the compiler not to reorder accesses
around it, and we have to rely on MSVC not currently having any other
optimizations for const members to worry about.

Reviewed By: yfeldblum

Differential Revision: D5723782

fbshipit-source-id: a68caa4673a5c410b326c1d2e3c0752bd945f4a6

folly/Launder.h

index 6a3b976dee649d7fadd38220370039f44c202752..fb0e5f7a71ea5e44f2278cebfc65a18ec5074be5 100644 (file)
@@ -35,6 +35,11 @@ FOLLY_NODISCARD inline T* launder(T* in) noexcept {
   // so the compiler has to assume that it has been changed inside the block.
   __asm__("" : "+r"(in));
   return in;
+#elif defined(_WIN32)
+  // MSVC does not currently have optimizations around const members of structs.
+  // _ReadWriteBarrier() will prevent compiler reordering memory accesses.
+  _ReadWriteBarrier();
+  return in;
 #else
   static_assert(
       false, "folly::launder is not implemented for this environment");