From c4bf458e47049fa7de293b1e37660b73c4541c6f Mon Sep 17 00:00:00 2001
From: Sam Lantinga <slouken@libsdl.org>
Date: Fri, 21 Jan 2011 23:46:51 -0800
Subject: [PATCH] Fixed bug #1097

There are problems with including intrin.h in C linkage in C++ compilation,
and further conflicts between intrin.h and winnt.h on Visual Studio 2005.
---
 include/SDL_atomic.h      | 10 ++++++++--
 src/atomic/SDL_spinlock.c |  4 ++++
 2 files changed, 12 insertions(+), 2 deletions(-)

diff --git a/include/SDL_atomic.h b/include/SDL_atomic.h
index de643f8d..c2dfd045 100644
--- a/include/SDL_atomic.h
+++ b/include/SDL_atomic.h
@@ -56,6 +56,13 @@
 
 #include "begin_code.h"
 
+/* Need to do this here because intrin.h has C++ code in it */
+/* Visual Studio 2005 has a bug where intrin.h conflicts with winnt.h */
+#if defined(_MSC_VER) && (_MSC_VER >= 1500)
+#include <intrin.h>
+#define HAVE_MSC_ATOMICS
+#endif
+
 /* Set up for C function definitions, even when using C++ */
 #ifdef __cplusplus
 /* *INDENT-OFF* */
@@ -112,8 +119,7 @@ extern DECLSPEC void SDLCALL SDL_AtomicUnlock(SDL_SpinLock *lock);
  */
 #ifndef SDL_DISABLE_ATOMIC_INLINE
 
-#if defined(_MSC_VER)
-#include <intrin.h>
+#if defined(HAVE_MSC_ATOMICS)
 
 #define SDL_AtomicSet(a, v)     _InterlockedExchange((long*)&(a)->value, (v))
 #define SDL_AtomicGet(a)        ((a)->value)
diff --git a/src/atomic/SDL_spinlock.c b/src/atomic/SDL_spinlock.c
index 61d42fb9..19efbfca 100644
--- a/src/atomic/SDL_spinlock.c
+++ b/src/atomic/SDL_spinlock.c
@@ -24,6 +24,10 @@
 #include "SDL_atomic.h"
 #include "SDL_timer.h"
 
+/* Don't do the check for Visual Studio 2005, it's safe here */
+#if defined(_MSC_VER)
+#include <intrin.h>
+#endif
 
 /* This function is where all the magic happens... */
 SDL_bool
-- 
2.18.1