summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--misc.h11
-rw-r--r--smartptr.h8
2 files changed, 14 insertions, 5 deletions
diff --git a/misc.h b/misc.h
index f0df03c2..f2b44e50 100644
--- a/misc.h
+++ b/misc.h
@@ -61,6 +61,17 @@
# pragma GCC diagnostic ignored "-Wunused-parameter"
#endif
+#if defined(_MSC_VER) && (_MSC_VER >= 1400)
+# pragma intrinsic(_ReadWriteBarrier)
+# define MEMORY_BARRIER() _ReadWriteBarrier()
+#elif defined(_INTEL_COMPILER)
+# define MEMORY_BARRIER() __memory_barrier()
+#elif defined(__GNUC__) || defined(__clang__)
+# define MEMORY_BARRIER() __asm__ __volatile__ ("" ::: "memory")
+#else
+# define MEMORY_BARRIER()
+#endif
+
NAMESPACE_BEGIN(CryptoPP)
// ************** compile-time assertion ***************
diff --git a/smartptr.h b/smartptr.h
index 057f5213..db5441fe 100644
--- a/smartptr.h
+++ b/smartptr.h
@@ -3,6 +3,7 @@
#include "config.h"
#include "stdcpp.h"
+#include "misc.h"
#include "trap.h"
NAMESPACE_BEGIN(CryptoPP)
@@ -51,11 +52,8 @@ template <class T> simple_ptr<T>::~simple_ptr()
delete m_p;
m_p = NULL;
-#ifdef __GNUC__
- // From Andrew Haley (GCC Dev), to tame the optimizer so the assignment is always performed.
- // See "Disable optimizations in one function" on the GCC mailing list.
- asm volatile ("" : : : "memory");
-#endif
+ // https://github.com/weidai11/cryptopp/issues/6
+ MEMORY_BARRIER();
}
template <class T> class member_ptr