aboutsummaryrefslogtreecommitdiff
path: root/lang/erlang-riak/files/patch-commit-5a00e72
blob: 0d58d42dd21157c9317825066e6e157207747326 (plain) (blame)
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
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
commit 5a00e724a58ee29d4012cca79c8aa33979e74eb6
Author: Sverker Eriksson <sverker@erlang.org>
Date:   Wed Nov 20 21:33:20 2013 +0100

    erts: Fix alignment bug in allocator start code
    
    Bug never released.

diff --git erts/emulator/beam/erl_alloc_util.c erts/emulator/beam/erl_alloc_util.c
index 1fdee4d..00b87ac 100644
--- erts/emulator/beam/erl_alloc_util.c
+++ erts/emulator/beam/erl_alloc_util.c
@@ -372,6 +372,8 @@ do {										\
 
 #define ERTS_CRR_ALCTR_FLG_IN_POOL	(((erts_aint_t) 1) << 0)
 #define ERTS_CRR_ALCTR_FLG_BUSY		(((erts_aint_t) 1) << 1)
+#define ERTS_CRR_ALCTR_FLG_MASK (ERTS_CRR_ALCTR_FLG_IN_POOL | \
+                                 ERTS_CRR_ALCTR_FLG_BUSY)
 
 #ifdef ERTS_SMP
 #define SBC_HEADER_SIZE	   						\
@@ -1404,14 +1406,14 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
 
 	    if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock
 		&& pref_allctr->thread_safe) {
-		used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
+		used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
 		if (pref_allctr == used_allctr) {
 		    erts_mtx_lock(&pref_allctr->mutex);
 		    locked_pref_allctr = 1;
 		}
 	    }
 
-	    while ((iallctr & ((~FLG_MASK)|ERTS_CRR_ALCTR_FLG_IN_POOL))
+	    while ((iallctr & ((~ERTS_CRR_ALCTR_FLG_MASK)|ERTS_CRR_ALCTR_FLG_IN_POOL))
 		   == (((erts_aint_t) pref_allctr)|ERTS_CRR_ALCTR_FLG_IN_POOL)) {
 		erts_aint_t act;
 
@@ -1426,7 +1428,7 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
 		iallctr = act;
 	    }
 
-	    used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
+	    used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
 
 	    if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock) {
 		if (locked_pref_allctr && used_allctr != pref_allctr) {
@@ -1436,16 +1438,16 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
 	    }
 
 	    ERTS_ALC_CPOOL_ASSERT(
-		(((iallctr & ~FLG_MASK) == (erts_aint_t) pref_allctr)
-		 ? (((iallctr & FLG_MASK) == ERTS_CRR_ALCTR_FLG_IN_POOL)
-		    || ((iallctr & FLG_MASK) == 0))
+		(((iallctr & ~ERTS_CRR_ALCTR_FLG_MASK) == (erts_aint_t) pref_allctr)
+		 ? (((iallctr & ERTS_CRR_ALCTR_FLG_MASK) == ERTS_CRR_ALCTR_FLG_IN_POOL)
+		    || ((iallctr & ERTS_CRR_ALCTR_FLG_MASK) == 0))
 		 : 1));
 
 	    return used_allctr;
 	}
     }
 
-    used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
+    used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
 
     if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock
 	&& used_allctr == pref_allctr
@@ -1776,7 +1778,7 @@ handle_delayed_dealloc(Allctr_t *allctr,
 	    ERTS_ALC_CPOOL_ASSERT(allctr == crr->cpool.orig_allctr);
 	    ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr)
 				  != (erts_smp_atomic_read_nob(&crr->allctr)
-				      & ~FLG_MASK));
+				      & ~ERTS_CRR_ALCTR_FLG_MASK));
 
 	    erts_smp_atomic_set_nob(&crr->allctr, ((erts_aint_t) allctr));
 
@@ -2919,7 +2921,7 @@ cpool_fetch(Allctr_t *allctr, UWord size)
 #ifdef ERTS_ALC_CPOOL_DEBUG
 	    ERTS_ALC_CPOOL_ASSERT(erts_smp_atomic_xchg_nob(&crr->allctr,
 							   ((erts_aint_t) allctr))
-				  == (((erts_aint_t) allctr) & ~FLG_MASK));
+				  == (((erts_aint_t) allctr) & ~ERTS_CRR_ALCTR_FLG_MASK));
 #else
 	    erts_smp_atomic_set_nob(&crr->allctr, ((erts_aint_t) allctr));
 #endif
@@ -2961,7 +2963,7 @@ cpool_fetch(Allctr_t *allctr, UWord size)
 					     (erts_aint_t) allctr,
 					     exp);
 	    if (act == exp) {
-		cpool_delete(allctr, ((Allctr_t *) (act & ~FLG_MASK)), crr);
+		cpool_delete(allctr, ((Allctr_t *) (act & ~ERTS_CRR_ALCTR_FLG_MASK)), crr);
 		return crr;
 	    }
 	}
@@ -3056,7 +3058,7 @@ schedule_dealloc_carrier(Allctr_t *allctr, Carrier_t *crr)
 	ERTS_ALC_CPOOL_ASSERT(crr == FIRST_BLK_TO_MBC(allctr, blk));
 	ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr)
 			      == (erts_smp_atomic_read_nob(&crr->allctr)
-				  & ~FLG_MASK));
+				  & ~ERTS_CRR_ALCTR_FLG_MASK));
 
 	if (ddq_enqueue(&orig_allctr->dd.q, BLK2UMEM(blk), cinit))
 	    erts_alloc_notify_delayed_dealloc(orig_allctr->ix);
@@ -5422,6 +5424,11 @@ erts_alcu_start(Allctr_t *allctr, AllctrInit_t *init)
 {
     /* erts_alcu_start assumes that allctr has been zeroed */
 
+    if (((UWord)allctr & ERTS_CRR_ALCTR_FLG_MASK) != 0) {
+        erl_exit(ERTS_ABORT_EXIT, "%s:%d:erts_alcu_start: Alignment error\n",
+                 __FILE__, __LINE__);
+    }
+
     if (!initialized)
 	goto error;