* signal.c (rb_atomic_t): GCC (of at least recent versions)

has  ubiquitos  support  for  atomic  operations.   On  that
  compiler a C  program can isse a memory  barrier using these
  dedicated  instructions.  According to  the GCC  manual they
  cargo culted  this feature form  the Itanium ABI  so chances
  are that  other compilers  could also support  this feature.
  But so far GCC is the  only compiler that I know to have it.
  Also note that this works on non-Itanium machines.



git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@29589 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
shyouhei 2010-10-25 07:46:53 +00:00
Родитель 0d78d991ca
Коммит 2c770d676c
2 изменённых файлов: 22 добавлений и 0 удалений

Просмотреть файл

@ -1,3 +1,14 @@
Mon Oct 25 16:38:07 2010 URABE Shyouhei <shyouhei@ruby-lang.org>
* signal.c (rb_atomic_t): GCC (of at least recent versions)
has ubiquitos support for atomic operations. On that
compiler a C program can isse a memory barrier using these
dedicated instructions. According to the GCC manual they
cargo culted this feature form the Itanium ABI so chances
are that other compilers could also support this feature.
But so far GCC is the only compiler that I know to have it.
Also note that this works on non-Itanium machines.
Mon Oct 25 06:21:35 2010 Nobuyoshi Nakada <nobu@ruby-lang.org>
* vsnprintf.c (BSD_vfprintf): prec digits fractal part should be

Просмотреть файл

@ -25,6 +25,17 @@ typedef LONG rb_atomic_t;
# define ATOMIC_INC(var) InterlockedIncrement(&(var))
# define ATOMIC_DEC(var) InterlockedDecrement(&(var))
#elsif __GNUC__ >= 4
/* @shyouhei hack to support atomic operations in case of gcc. Gcc
* has its own pseudo-insns to support them. See info, or
* http://gcc.gnu.org/onlinedocs/gcc/Atomic-Builtins.html */
typedef unsigned char rb_atomic_t; /* Anything OK */
# define ATOMIC_TEST(var) __sync_lock_test_and_set(&(var), 0)
# define ATOMIC_SET(var, val) __sync_lock_test_and_set(&(var), (val))
# define ATOMIC_INC(var) __sync_fetch_and_add(&(var), 1)
# define ATOMIC_DEC(var) __sync_fetch_and_sub(&(var), 1)
#else
typedef int rb_atomic_t;