ruby-changes:24258
From: ngoto <ko1@a...>
Date: Wed, 4 Jul 2012 22:02:18 +0900 (JST)
Subject: [ruby-changes:24258] ngoto:r36309 (trunk): * gc.c, atomic.h (ATOMIC_SIZE_*): moved from gc.c to atomic.h
ngoto 2012-07-04 22:02:03 +0900 (Wed, 04 Jul 2012) New Revision: 36309 http://svn.ruby-lang.org/cgi-bin/viewvc.cgi?view=rev&revision=36309 Log: * gc.c, atomic.h (ATOMIC_SIZE_*): moved from gc.c to atomic.h [ruby-dev:45909] Modified files: trunk/ChangeLog trunk/atomic.h trunk/gc.c Index: ChangeLog =================================================================== --- ChangeLog (revision 36308) +++ ChangeLog (revision 36309) @@ -1,3 +1,8 @@ +Wed Jul 4 21:41:44 2012 Naohisa Goto <ngotogenome@g...> + + * gc.c, atomic.h (ATOMIC_SIZE_*): moved from gc.c to atomic.h + [ruby-dev:45909] + Wed Jul 4 19:13:15 2012 Masaki Suketa <masaki.suketa@n...> * test/win32ole/test_win32ole.rb (test_s_codepage_changed): Index: gc.c =================================================================== --- gc.c (revision 36308) +++ gc.c (revision 36309) @@ -21,6 +21,7 @@ #include "internal.h" #include "gc.h" #include "constant.h" +#include "atomic.h" #include <stdio.h> #include <setjmp.h> #include <sys/types.h> @@ -60,56 +61,6 @@ # define VALGRIND_MAKE_MEM_UNDEFINED(p, n) /* empty */ #endif -#if defined _WIN32 -# ifdef _M_AMD64 -# define ATOMIC_SIZE_ADD(var, val) InterlockedExchangeAdd64(&(var), (val)) -# define ATOMIC_SIZE_SUB(var, val) InterlockedExchangeAdd64(&(var), -(val)) -# define ATOMIC_SIZE_INC(var) InterlockedIncrement64(&(var)) -# define ATOMIC_SIZE_DEC(var) InterlockedDecrement64(&(var)) -# define ATOMIC_SIZE_EXCHANGE(var, val) InterlockedExchange64(&(var), (val)) -# else -# define ATOMIC_SIZE_ADD(var, val) InterlockedExchangeAdd(&(var), (val)) -# define ATOMIC_SIZE_SUB(var, val) InterlockedExchangeAdd(&(var), -(val)) -# define ATOMIC_SIZE_INC(var) InterlockedIncrement(&(var)) -# define ATOMIC_SIZE_DEC(var) InterlockedDecrement(&(var)) -# define ATOMIC_SIZE_EXCHANGE(var, val) InterlockedExchange(&(var), (val)) -# endif -#elif defined HAVE_GCC_ATOMIC_BUILTINS -# define ATOMIC_SIZE_ADD(var, val) __sync_fetch_and_add(&(var), (val)) -# define ATOMIC_SIZE_SUB(var, val) __sync_fetch_and_sub(&(var), (val)) -# define ATOMIC_SIZE_INC(var) __sync_fetch_and_add(&(var), 1) -# define ATOMIC_SIZE_DEC(var) __sync_fetch_and_sub(&(var), 1) -# define ATOMIC_SIZE_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val)) -#elif defined(__sun) -#include <atomic.h> -# if SIZEOF_SIZE_T == SIZEOF_LONG -# define ATOMIC_SIZE_ADD(var, val) atomic_add_long(&(var), (val)) -# define ATOMIC_SIZE_SUB(var, val) atomic_add_long(&(var), -(val)) -# define ATOMIC_SIZE_INC(var) atomic_inc_ulong(&(var)) -# define ATOMIC_SIZE_DEC(var) atomic_dec_ulong(&(var)) -# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_swap_ulong(&(var), (val)) -# else -# define ATOMIC_SIZE_ADD(var, val) atomic_add_int(&(var), (val)) -# define ATOMIC_SIZE_SUB(var, val) atomic_add_int(&(var), -(val)) -# define ATOMIC_SIZE_INC(var) atomic_inc_uint(&(var)) -# define ATOMIC_SIZE_DEC(var) atomic_dec_uint(&(var)) -# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_swap_uint(&(var), (val)) -# endif -#else -# define ATOMIC_SIZE_ADD(var, val) (void)((var) += (val)) -# define ATOMIC_SIZE_SUB(var, val) (void)((var) -= (val)) -# define ATOMIC_SIZE_INC(var) ((var)++) -# define ATOMIC_SIZE_DEC(var) ((var)--) -# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_size_exchange(&(var), (val)) -static inline size_t -atomic_size_exchange(size_t *ptr, size_t val) -{ - size_t old = *ptr; - *ptr = val; - return old; -} -#endif - #define rb_setjmp(env) RUBY_SETJMP(env) #define rb_jmp_buf rb_jmpbuf_t Index: atomic.h =================================================================== --- atomic.h (revision 36308) +++ atomic.h (revision 36309) @@ -30,6 +30,20 @@ #endif # define ATOMIC_EXCHANGE(var, val) InterlockedExchange(&(var), (val)) +# ifdef _M_AMD64 +# define ATOMIC_SIZE_ADD(var, val) InterlockedExchangeAdd64(&(var), (val)) +# define ATOMIC_SIZE_SUB(var, val) InterlockedExchangeAdd64(&(var), -(val)) +# define ATOMIC_SIZE_INC(var) InterlockedIncrement64(&(var)) +# define ATOMIC_SIZE_DEC(var) InterlockedDecrement64(&(var)) +# define ATOMIC_SIZE_EXCHANGE(var, val) InterlockedExchange64(&(var), (val)) +# else +# define ATOMIC_SIZE_ADD(var, val) InterlockedExchangeAdd(&(var), (val)) +# define ATOMIC_SIZE_SUB(var, val) InterlockedExchangeAdd(&(var), -(val)) +# define ATOMIC_SIZE_INC(var) InterlockedIncrement(&(var)) +# define ATOMIC_SIZE_DEC(var) InterlockedDecrement(&(var)) +# define ATOMIC_SIZE_EXCHANGE(var, val) InterlockedExchange(&(var), (val)) +# endif + #elif defined HAVE_GCC_ATOMIC_BUILTINS /* @shyouhei hack to support atomic operations in case of gcc. Gcc * has its own pseudo-insns to support them. See info, or @@ -42,6 +56,12 @@ # define ATOMIC_OR(var, val) __sync_or_and_fetch(&(var), (val)) # define ATOMIC_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val)) +# define ATOMIC_SIZE_ADD(var, val) __sync_fetch_and_add(&(var), (val)) +# define ATOMIC_SIZE_SUB(var, val) __sync_fetch_and_sub(&(var), (val)) +# define ATOMIC_SIZE_INC(var) __sync_fetch_and_add(&(var), 1) +# define ATOMIC_SIZE_DEC(var) __sync_fetch_and_sub(&(var), 1) +# define ATOMIC_SIZE_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val)) + #elif defined(__sun) #include <atomic.h> typedef unsigned int rb_atomic_t; @@ -52,6 +72,20 @@ # define ATOMIC_OR(var, val) atomic_or_uint(&(var), (val)) # define ATOMIC_EXCHANGE(var, val) atomic_swap_uint(&(var), (val)) +# if SIZEOF_SIZE_T == SIZEOF_LONG +# define ATOMIC_SIZE_ADD(var, val) atomic_add_long(&(var), (val)) +# define ATOMIC_SIZE_SUB(var, val) atomic_add_long(&(var), -(val)) +# define ATOMIC_SIZE_INC(var) atomic_inc_ulong(&(var)) +# define ATOMIC_SIZE_DEC(var) atomic_dec_ulong(&(var)) +# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_swap_ulong(&(var), (val)) +# else +# define ATOMIC_SIZE_ADD(var, val) atomic_add_int(&(var), (val)) +# define ATOMIC_SIZE_SUB(var, val) atomic_add_int(&(var), -(val)) +# define ATOMIC_SIZE_INC(var) atomic_inc_uint(&(var)) +# define ATOMIC_SIZE_DEC(var) atomic_dec_uint(&(var)) +# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_swap_uint(&(var), (val)) +# endif + #else typedef int rb_atomic_t; #define NEED_RUBY_ATOMIC_EXCHANGE @@ -62,6 +96,19 @@ # define ATOMIC_DEC(var) ((var)--) # define ATOMIC_OR(var, val) ((var) |= (val)) # define ATOMIC_EXCHANGE(var, val) ruby_atomic_exchange(&(var), (val)) + +# define ATOMIC_SIZE_ADD(var, val) (void)((var) += (val)) +# define ATOMIC_SIZE_SUB(var, val) (void)((var) -= (val)) +# define ATOMIC_SIZE_INC(var) ((var)++) +# define ATOMIC_SIZE_DEC(var) ((var)--) +# define ATOMIC_SIZE_EXCHANGE(var, val) atomic_size_exchange(&(var), (val)) +static inline size_t +atomic_size_exchange(size_t *ptr, size_t val) +{ + size_t old = *ptr; + *ptr = val; + return old; +} #endif #endif /* RUBY_ATOMIC_H */ -- ML: ruby-changes@q... Info: http://www.atdot.net/~ko1/quickml/