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/