package/erlang: fix detection of libatomic_ops
authorYann E. MORIN <yann.morin.1998@free.fr>
Sun, 4 Jan 2015 14:17:14 +0000 (15:17 +0100)
committerThomas Petazzoni <thomas.petazzoni@free-electrons.com>
Sun, 4 Jan 2015 20:26:07 +0000 (21:26 +0100)
For some platforms, hardware-assisted compare-and-swap may not be
available, so libatomic_ops will not provide it.

However, libatomic_ops can provide a purely software CAS emulation, but
must be instructed to do so. erlang just forgot to tell libatomic_ops
that it does require CAS.

Fix that by defining AO_REQUIRE_CAS before including atmoic_ops.h, like
is done in libunwind, as pointed out by Thomas.

Also, erlang has a convoluted, mind-alterating set on aclocal.m4 macros,
that just forgets to link against -latomic_ops when checking CAS is
available, so that even if CAS is available, configure chokes.

Since I would like to keep the little sanity I still have, just force
linking with -latomic_ops. This is useless when the check is natrally
sucessful (i.e. on platforms where CAS is available in HW), but we
would eventually link with -latomic_ops there, too; it's just redundant.

Overall, just consider that erlang requires libatomic_ops, so forcibly
depend on it, it is easier than trying to disable it. We can revisit
that whenever someone wants to run erlang on a platform for which there
is no libatomic_ops support.

Fixes a slew of autobuild ARM failures:
    http://autobuild.buildroot.org/results/e7b/e7bfc4893dea6b133f0794ef44d50ad89bcb6662/
    http://autobuild.buildroot.org/results/3e9/3e9c307f1ec6536482641019dcaa94677f7267a3/
    http://autobuild.buildroot.org/results/a85/a85ca414e5b67af46510abd7b610eb5ae8661de4/
    [...]

[Thomas: fix minor typos in commit log, add dependency on
BR2_PACKAGE_LIBATOMIC_ARCH_SUPPORTS to the Erlang comment about thread
and shared library dependency.]

Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
Cc: Frank Hunleth <fhunleth@troodon-software.com>
Signed-off-by: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
package/erlang/0001-build-fix.patch [new file with mode: 0644]
package/erlang/0002-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch [new file with mode: 0644]
package/erlang/Config.in
package/erlang/erlang-build-fix.patch [deleted file]
package/erlang/erlang.mk

diff --git a/package/erlang/0001-build-fix.patch b/package/erlang/0001-build-fix.patch
new file mode 100644 (file)
index 0000000..ff821c9
--- /dev/null
@@ -0,0 +1,13 @@
+apply-patches.sh deletes this file from the source directory.
+
+--- erlang-R15B01.old/lib/tools/emacs/Makefile 2012-04-04
++++ erlang-R15B01/lib/tools/emacs/Makefile     2012-04-04 15:55:16.978957307 +0100
+@@ -51,7 +51,7 @@
+
+ ELC_FILES = $(EMACS_FILES:%=%.elc)
+
+-TEST_FILES = test.erl.indented test.erl.orig
++TEST_FILES = test.erl.indented
+
+ # ----------------------------------------------------
+ # Targets
diff --git a/package/erlang/0002-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch b/package/erlang/0002-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch
new file mode 100644 (file)
index 0000000..8e40143
--- /dev/null
@@ -0,0 +1,70 @@
+From 439fa2eae78a8900bda120072335be19d626498c Mon Sep 17 00:00:00 2001
+From: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Date: Sun, 28 Dec 2014 23:39:40 +0100
+Subject: [PATCH] erts/ethread: instruct libatomic_ops we do require CAS
+
+We do require compare-and-swap (CAS), so we must instruct libatomic_ops
+to provide it, even if the architecture does not have instructions for
+it.
+
+For example, on ARM, LDREX is required for fast CAS. But LDREX is only
+available on ARMv6, so by default libatomic_ops will not have CAS for
+anything below, like ARMv5. But ARMv5 is always UP, so using an
+emulated CAS (that is signal-asyn-safe) is still possible (albeit much
+slower).
+
+Tell libatomic_ops to provide CAS, even if the hardware is not capable
+of it, by using emulated CAS, as per libatomic_ops dosc:
+    https://github.com/ivmai/libatomic_ops/blob/master/doc/README.txt#L28
+
+    If this is included after defining AO_REQUIRE_CAS, then the package
+    will make an attempt to emulate compare-and-swap in a way that (at
+    least on Linux) should still be async-signal-safe.
+
+Thanks go to Thomas for all this insight! :-)
+Thanks go to Frank for reporting the issue! :-)
+
+Signed-off-by: "Yann E. MORIN" <yann.morin.1998@free.fr>
+Cc: Thomas Petazzoni <thomas.petazzoni@free-electrons.com>
+Cc: Frank Hunleth <fhunleth@troodon-software.com>
+---
+ erts/include/internal/libatomic_ops/ethread.h | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/erts/include/internal/libatomic_ops/ethread.h b/erts/include/internal/libatomic_ops/ethread.h
+index d65ee19..71d3598 100644
+--- a/erts/include/internal/libatomic_ops/ethread.h
++++ b/erts/include/internal/libatomic_ops/ethread.h
+@@ -35,6 +35,7 @@
+ #define ETHR_NATIVE_IMPL__ "libatomic_ops"
++#define AO_REQUIRE_CAS
+ #include "atomic_ops.h"
+ #include "ethr_membar.h"
+ #include "ethr_atomic.h"
+diff --git a/erts/aclocal.m4 b/erts/aclocal.m4
+index d65ee19..71d3598 100644
+--- a/erts/aclocal.m4
++++ b/erts/aclocal.m4
+@@ -1414,7 +1414,8 @@
+                   fi;;
+           esac
+           ethr_have_libatomic_ops=no
+-          AC_TRY_LINK([#include "atomic_ops.h"],
++          AC_TRY_LINK([#define AO_REQUIRE_CAS
++                    #include "atomic_ops.h"],
+                       [
+                           volatile AO_t x;
+                           AO_t y;
+@@ -1455,6 +1455,7 @@
+               AC_CHECK_SIZEOF(AO_t, ,
+                               [
+                                   #include <stdio.h>
++                                  #define AO_REQUIRE_CAS
+                                   #include "atomic_ops.h"
+                               ])
+               AC_DEFINE_UNQUOTED(ETHR_SIZEOF_AO_T, $ac_cv_sizeof_AO_t, [Define to the size of AO_t if libatomic_ops is used])
+-- 
+1.9.1
+
index 56830dae448bdf8ff3616d600442b02a7bc8b405..51c72cb2b50161ae13be144de8c78e6b49cab4ec 100644 (file)
@@ -1,4 +1,5 @@
 comment "erlang needs a toolchain w/ threads, shared library"
+       depends on BR2_PACKAGE_LIBATOMIC_ARCH_SUPPORTS
        depends on !BR2_TOOLCHAIN_HAS_THREADS && BR2_STATIC_LIBS
 
 config BR2_PACKAGE_ERLANG
@@ -6,6 +7,8 @@ config BR2_PACKAGE_ERLANG
        depends on BR2_USE_MMU # fork()
        depends on BR2_TOOLCHAIN_HAS_THREADS
        depends on !BR2_STATIC_LIBS
+       depends on BR2_PACKAGE_LIBATOMIC_ARCH_SUPPORTS
+       select BR2_PACKAGE_LIBATOMIC_OPS
        help
          Erlang is a programming language used to build massively scalable
          soft real-time systems with requirements on high availability.
diff --git a/package/erlang/erlang-build-fix.patch b/package/erlang/erlang-build-fix.patch
deleted file mode 100644 (file)
index ff821c9..0000000
+++ /dev/null
@@ -1,13 +0,0 @@
-apply-patches.sh deletes this file from the source directory.
-
---- erlang-R15B01.old/lib/tools/emacs/Makefile 2012-04-04
-+++ erlang-R15B01/lib/tools/emacs/Makefile     2012-04-04 15:55:16.978957307 +0100
-@@ -51,7 +51,7 @@
-
- ELC_FILES = $(EMACS_FILES:%=%.elc)
-
--TEST_FILES = test.erl.indented test.erl.orig
-+TEST_FILES = test.erl.indented
-
- # ----------------------------------------------------
- # Targets
index 0b8619e41300aaf3a4a5cd9bed6378eba06feabd..81ac436d95ed56579b00872df41a90d6de262e8a 100644 (file)
@@ -13,6 +13,9 @@ ERLANG_LICENSE = EPL
 ERLANG_LICENSE_FILES = EPLICENCE
 ERLANG_INSTALL_STAGING = YES
 
+# Touching erts/configure.in
+ERLANG_AUTORECONF = YES
+
 # The configure checks for these functions fail incorrectly
 ERLANG_CONF_ENV = ac_cv_func_isnan=yes ac_cv_func_isinf=yes
 
@@ -22,10 +25,8 @@ ERLANG_CONF_ENV += erl_xcomp_sysroot=$(STAGING_DIR)
 
 ERLANG_CONF_OPTS = --without-javac
 
-ifeq ($(BR2_PACKAGE_LIBATOMIC_OPS),y)
 ERLANG_DEPENDENCIES += libatomic_ops
-ERLANG_CONF_OPTS += --with-libatomic_ops=$(STAGING_DIR)/usr
-endif
+ERLANG_CONF_OPTS += --with-libatomic_ops=$(STAGING_DIR)/usr LIBS=-latomic_ops
 
 # erlang uses openssl for all things crypto. Since the host tools (such as
 # rebar) uses crypto, we need to build host-erlang with support for openssl.