From fc690079c889ed5a97359515d75fe9260dd9ea91 Mon Sep 17 00:00:00 2001 From: Eric Wong Date: Wed, 28 Aug 2013 10:10:29 +0000 Subject: [PATCH] extconf: try harder for gcc atomics in i386-configured systems __sync_lock_test_and_set might not be the correct check after all, but __sync_val_compare_and_swap probably is. At least this is what Ruby 2.0.0 uses to check and attempt -march=i486 on. --- ext/raindrops/extconf.rb | 13 ++++++++++++- 1 file changed, 12 insertions(+), 1 deletion(-) diff --git a/ext/raindrops/extconf.rb b/ext/raindrops/extconf.rb index 447a90a..f012808 100644 --- a/ext/raindrops/extconf.rb +++ b/ext/raindrops/extconf.rb @@ -20,6 +20,7 @@ int main(int argc, char * const argv[]) { unsigned long i = 0; __sync_lock_test_and_set(&i, 0); __sync_lock_test_and_set(&i, 1); + __sync_bool_compare_and_swap(&i, 0, 1); __sync_add_and_fetch(&i, argc); __sync_sub_and_fetch(&i, argc); return 0; @@ -30,7 +31,17 @@ SRC $defs.push(format("-DHAVE_GCC_ATOMIC_BUILTINS")) true else - false + # some compilers still target 386 by default, but we need at least 486 + # to run atomic builtins. + prev_cflags = $CFLAGS + $CFLAGS += " -march=i486 " + if try_link(src) + $defs.push(format("-DHAVE_GCC_ATOMIC_BUILTINS")) + true + else + prev_cflags = $CFLAGS + false + end end end or have_header('atomic_ops.h') or abort <<-SRC -- 2.11.4.GIT