[前][次][番号順一覧][スレッド一覧]

ruby-changes:20424

From: nobu <ko1@a...>
Date: Sat, 9 Jul 2011 16:56:13 +0900 (JST)
Subject: [ruby-changes:20424] nobu:r32472 (trunk): * atomic.h (ATOMIC_OR): _InterlockedOr is unavailable in VC6.

nobu	2011-07-09 16:56:04 +0900 (Sat, 09 Jul 2011)

  New Revision: 32472

  http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=32472

  Log:
    * atomic.h (ATOMIC_OR): _InterlockedOr is unavailable in VC6.

  Modified files:
    trunk/ChangeLog
    trunk/atomic.h

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 32471)
+++ ChangeLog	(revision 32472)
@@ -1,5 +1,7 @@
-Sat Jul  9 16:54:35 2011  Nobuyoshi Nakada  <nobu@r...>
+Sat Jul  9 16:56:01 2011  Nobuyoshi Nakada  <nobu@r...>
 
+	* atomic.h (ATOMIC_OR): _InterlockedOr is unavailable in VC6.
+
 	* numeric.c (ULLONG_MAX): fallback definition.
 
 Sat Jul  9 15:59:19 2011  Nobuyoshi Nakada  <nobu@r...>
Index: atomic.h
===================================================================
--- atomic.h	(revision 32471)
+++ atomic.h	(revision 32472)
@@ -2,7 +2,7 @@
 #define RUBY_ATOMIC_H
 
 #ifdef _WIN32
-#ifdef _MSC_VER
+#if defined _MSC_VER && _MSC_VER > 1200
 #pragma intrinsic(_InterlockedOr)
 #endif
 typedef LONG rb_atomic_t;
@@ -12,7 +12,20 @@
 # define ATOMIC_DEC(var) InterlockedDecrement(&(var))
 #if defined __GNUC__
 # define ATOMIC_OR(var, val) __asm__("lock\n\t" "orl\t%1, %0" : "=m"(var) : "Ir"(val))
+#elif defined _MSC_VER && _MSC_VER <= 1200
+# define ATOMIC_OR(var, val) rb_w32_atomic_or(&(var), (val))
+static inline void
+rb_w32_atomic_or(volatile rb_atomic_t *var, rb_atomic_t val)
+{
+#ifdef _M_IX86
+    __asm mov eax, var;
+    __asm mov ecx, val;
+    __asm lock or [eax], ecx;
 #else
+#error unsupported architecture
+#endif
+}
+#else
 # define ATOMIC_OR(var, val) _InterlockedOr(&(var), (val))
 #endif
 # define ATOMIC_EXCHANGE(var, val) InterlockedExchange(&(var), (val))

--
ML: ruby-changes@q...
Info: http://www.atdot.net/~ko1/quickml/

[前][次][番号順一覧][スレッド一覧]