Blame view

buildroot/buildroot-2016.08.1/package/erlang/0002-erts-ethread-instruct-libatomic_ops-we-do-require-CA.patch 2.54 KB
6b13f685e   김민수   BSP 최초 추가
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  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