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

ruby-changes:25840

From: ngoto <ko1@a...>
Date: Tue, 27 Nov 2012 19:22:10 +0900 (JST)
Subject: [ruby-changes:25840] ngoto:r37897 (trunk): * ruby_atomic.h (ATOMIC_CAS): added for Solaris and other platforms.

ngoto	2012-11-27 19:21:59 +0900 (Tue, 27 Nov 2012)

  New Revision: 37897

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

  Log:
    * ruby_atomic.h (ATOMIC_CAS): added for Solaris and other platforms.
    * ruby_atomic.h, signal.c (NEED_RUBY_ATOMIC_OPS): renamed from
      NEED_RUBY_ATOMIC_EXCHANGE.
    * signal.c (ruby_atomic_compare_and_swap): naive, non-atomic
      compare-and-swap implementation only used for platforms without
      valid support for atomic operations.

  Modified files:
    trunk/ChangeLog
    trunk/ruby_atomic.h
    trunk/signal.c

Index: ChangeLog
===================================================================
--- ChangeLog	(revision 37896)
+++ ChangeLog	(revision 37897)
@@ -1,3 +1,12 @@
+Tue Nov 27 18:51:06 2012  Naohisa Goto  <ngotogenome@g...>
+
+	* ruby_atomic.h (ATOMIC_CAS): added for Solaris and other platforms.
+	* ruby_atomic.h, signal.c (NEED_RUBY_ATOMIC_OPS): renamed from
+	  NEED_RUBY_ATOMIC_EXCHANGE.
+	* signal.c (ruby_atomic_compare_and_swap): naive, non-atomic
+	  compare-and-swap implementation only used for platforms without
+	  valid support for atomic operations.
+
 Tue Nov 27 17:43:46 2012  Eric Hodel  <drbrain@s...>
 
 	* lib/rdoc/*:  Added --root option for building documentation outside
Index: ruby_atomic.h
===================================================================
--- ruby_atomic.h	(revision 37896)
+++ ruby_atomic.h	(revision 37897)
@@ -73,6 +73,7 @@
 # define ATOMIC_DEC(var) atomic_dec_uint(&(var))
 # define ATOMIC_OR(var, val) atomic_or_uint(&(var), (val))
 # define ATOMIC_EXCHANGE(var, val) atomic_swap_uint(&(var), (val))
+# define ATOMIC_CAS(var, oldval, newval) atomic_cas_uint(&(var), (oldval), (newval))
 
 # if SIZEOF_SIZE_T == SIZEOF_LONG
 #  define ATOMIC_SIZE_ADD(var, val) atomic_add_long(&(var), (val))
@@ -90,14 +91,18 @@
 
 #else
 typedef int rb_atomic_t;
-#define NEED_RUBY_ATOMIC_EXCHANGE
+#define NEED_RUBY_ATOMIC_OPS
 extern rb_atomic_t ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val);
+extern rb_atomic_t ruby_atomic_compare_and_swap(rb_atomic_t *ptr,
+						rb_atomic_t cmp,
+						rb_atomic_t newval);
 
 # define ATOMIC_SET(var, val) (void)((var) = (val))
 # define ATOMIC_INC(var) ((var)++)
 # define ATOMIC_DEC(var) ((var)--)
 # define ATOMIC_OR(var, val) ((var) |= (val))
 # define ATOMIC_EXCHANGE(var, val) ruby_atomic_exchange(&(var), (val))
+# define ATOMIC_CAS(var, oldval, newval) ruby_atomic_compare_and_swap(&(var), (oldval), (newval))
 
 # define ATOMIC_SIZE_ADD(var, val) (void)((var) += (val))
 # define ATOMIC_SIZE_SUB(var, val) (void)((var) -= (val))
Index: signal.c
===================================================================
--- signal.c	(revision 37896)
+++ signal.c	(revision 37897)
@@ -23,7 +23,7 @@
 # include "nacl/signal.h"
 #endif
 
-#ifdef NEED_RUBY_ATOMIC_EXCHANGE
+#ifdef NEED_RUBY_ATOMIC_OPS
 rb_atomic_t
 ruby_atomic_exchange(rb_atomic_t *ptr, rb_atomic_t val)
 {
@@ -31,6 +31,17 @@
     *ptr = val;
     return old;
 }
+
+rb_atomic_t
+ruby_atomic_compare_and_swap(rb_atomic_t *ptr, rb_atomic_t cmp,
+			     rb_atomic_t newval)
+{
+    rb_atomic_t old = *ptr;
+    if (old == cmp) {
+      *ptr = newval;
+    }
+    return old;
+}
 #endif
 
 #if defined(__BEOS__) || defined(__HAIKU__)

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

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