Skip to content

Commit bceb3cd

Browse files
committed
merge revision(s) 43851,43882,43996:
* ruby_atomic.h: use __atomic builtin functions supported by GCC. __sync family are legacy functions now and it is recommended that new code use the __atomic functions. http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html * configure.in: check existence of __atomic functions. * ruby_atomic.h: define ATOMIC_SIZE_CAS() with __atomic_compare_exchange_n() and refactoring. * ruby_atomic.h (ATOMIC_PTR_EXCHANGE): atomic exchange function for a generic pointer. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/branches/ruby_1_9_3@44952 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
1 parent 7493417 commit bceb3cd

File tree

4 files changed

+67
-6
lines changed

4 files changed

+67
-6
lines changed

ChangeLog

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,22 @@
1+
Fri Feb 14 19:07:13 2014 Nobuyoshi Nakada <nobu@ruby-lang.org>
2+
3+
* ruby_atomic.h (ATOMIC_PTR_EXCHANGE): atomic exchange function for
4+
a generic pointer.
5+
6+
Fri Feb 14 19:07:13 2014 Masaki Matsushita <glass.saga@gmail.com>
7+
8+
* ruby_atomic.h: define ATOMIC_SIZE_CAS() with
9+
__atomic_compare_exchange_n() and refactoring.
10+
11+
Fri Feb 14 19:07:13 2014 Masaki Matsushita <glass.saga@gmail.com>
12+
13+
* ruby_atomic.h: use __atomic builtin functions supported by GCC.
14+
__sync family are legacy functions now and it is recommended
15+
that new code use the __atomic functions.
16+
http://gcc.gnu.org/onlinedocs/gcc/_005f_005fatomic-Builtins.html
17+
18+
* configure.in: check existence of __atomic functions.
19+
120
Fri Feb 14 16:21:28 2014 NAKAMURA Usaku <usa@ruby-lang.org>
221

322
* ruby_atomic.h (ATOMIC_CAS): added.

configure.in

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -887,19 +887,35 @@ if test "$GCC" = yes; then
887887
AC_DEFINE_UNQUOTED([RUBY_ALIAS_FUNCTION_VOID(prot, name, args)],
888888
[RUBY_ALIAS_FUNCTION_TYPE(void, prot, name, args)])
889889
fi
890-
AC_CACHE_CHECK([for atomic builtins], [rb_cv_gcc_atomic_builtins], [
890+
891+
AC_CACHE_CHECK([for __atomic builtins], [rb_cv_gcc_atomic_builtins], [
891892
AC_TRY_LINK([unsigned char atomic_var;],
892893
[
893-
__sync_lock_test_and_set(&atomic_var, 0);
894-
__sync_lock_test_and_set(&atomic_var, 1);
895-
__sync_fetch_and_add(&atomic_var, 1);
896-
__sync_fetch_and_sub(&atomic_var, 1);
894+
__atomic_exchange_n(&atomic_var, 0, __ATOMIC_SEQ_CST);
895+
__atomic_exchange_n(&atomic_var, 1, __ATOMIC_SEQ_CST);
896+
__atomic_fetch_add(&atomic_var, 1, __ATOMIC_SEQ_CST);
897+
__atomic_fetch_sub(&atomic_var, 1, __ATOMIC_SEQ_CST);
897898
],
898899
[rb_cv_gcc_atomic_builtins=yes],
899900
[rb_cv_gcc_atomic_builtins=no])])
900901
if test "$rb_cv_gcc_atomic_builtins" = yes; then
901902
AC_DEFINE(HAVE_GCC_ATOMIC_BUILTINS)
902903
fi
904+
905+
AC_CACHE_CHECK([for __sync builtins], [rb_cv_gcc_sync_builtins], [
906+
AC_TRY_LINK([unsigned char atomic_var;],
907+
[
908+
__sync_lock_test_and_set(&atomic_var, 0);
909+
__sync_lock_test_and_set(&atomic_var, 1);
910+
__sync_fetch_and_add(&atomic_var, 1);
911+
__sync_fetch_and_sub(&atomic_var, 1);
912+
],
913+
[rb_cv_gcc_sync_builtins=yes],
914+
[rb_cv_gcc_sync_builtins=no])])
915+
if test "$rb_cv_gcc_sync_builtins" = yes; then
916+
AC_DEFINE(HAVE_GCC_SYNC_BUILTINS)
917+
fi
918+
903919
fi
904920

905921
AC_CACHE_CHECK(for exported function attribute, rb_cv_func_exported, [

ruby_atomic.h

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,30 @@
33

44
#if 0
55
#elif defined HAVE_GCC_ATOMIC_BUILTINS
6+
typedef unsigned int rb_atomic_t;
7+
# define ATOMIC_SET(var, val) (void)__atomic_exchange_n(&(var), (val), __ATOMIC_SEQ_CST)
8+
# define ATOMIC_INC(var) __atomic_fetch_add(&(var), 1, __ATOMIC_SEQ_CST)
9+
# define ATOMIC_DEC(var) __atomic_fetch_sub(&(var), 1, __ATOMIC_SEQ_CST)
10+
# define ATOMIC_OR(var, val) __atomic_or_fetch(&(var), (val), __ATOMIC_SEQ_CST)
11+
# define ATOMIC_EXCHANGE(var, val) __atomic_exchange_n(&(var), (val), __ATOMIC_SEQ_CST)
12+
# define ATOMIC_CAS(var, oldval, newval) \
13+
({ __typeof__(oldval) oldvaldup = (oldval); /* oldval should not be modified */ \
14+
__atomic_compare_exchange_n(&(var), &oldvaldup, (newval), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
15+
oldvaldup; })
16+
17+
# define ATOMIC_SIZE_ADD(var, val) __atomic_fetch_add(&(var), (val), __ATOMIC_SEQ_CST)
18+
# define ATOMIC_SIZE_SUB(var, val) __atomic_fetch_sub(&(var), (val), __ATOMIC_SEQ_CST)
19+
# define ATOMIC_SIZE_INC(var) __atomic_fetch_add(&(var), 1, __ATOMIC_SEQ_CST)
20+
# define ATOMIC_SIZE_DEC(var) __atomic_fetch_sub(&(var), 1, __ATOMIC_SEQ_CST)
21+
# define ATOMIC_SIZE_EXCHANGE(var, val) __atomic_exchange_n(&(var), (val), __ATOMIC_SEQ_CST)
22+
# define ATOMIC_SIZE_CAS(var, oldval, newval) \
23+
({ size_t oldvaldup = (oldval); \
24+
__atomic_compare_exchange_n(&(var), &oldvaldup, (newval), 0, __ATOMIC_SEQ_CST, __ATOMIC_SEQ_CST); \
25+
oldvaldup; })
26+
27+
# define ATOMIC_PTR_EXCHANGE(var, val) __atomic_exchange_n(&(var), (val), __ATOMIC_SEQ_CST)
28+
29+
#elif defined HAVE_GCC_SYNC_BUILTINS
630
/* @shyouhei hack to support atomic operations in case of gcc. Gcc
731
* has its own pseudo-insns to support them. See info, or
832
* http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html */
@@ -22,6 +46,8 @@ typedef unsigned int rb_atomic_t; /* Anything OK */
2246
# define ATOMIC_SIZE_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val))
2347
# define ATOMIC_PTR_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val))
2448

49+
# define ATOMIC_PTR_EXCHANGE(var, val) __sync_lock_test_and_set(&(var), (val))
50+
2551
#elif defined _WIN32
2652
#if defined _MSC_VER && _MSC_VER > 1200
2753
#pragma intrinsic(_InterlockedOr)

version.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
#define RUBY_VERSION "1.9.3"
2-
#define RUBY_PATCHLEVEL 531
2+
#define RUBY_PATCHLEVEL 532
33

44
#define RUBY_RELEASE_DATE "2014-02-14"
55
#define RUBY_RELEASE_YEAR 2014

0 commit comments

Comments
 (0)