View | Details | Raw Unified | Return to bug 213515
Collapse All | Expand All

(-)lang/erlang-riak/files/patch-commit-5a00e72 (+116 lines)
Line 0 Link Here
1
commit 5a00e724a58ee29d4012cca79c8aa33979e74eb6
2
Author: Sverker Eriksson <sverker@erlang.org>
3
Date:   Wed Nov 20 21:33:20 2013 +0100
4
5
    erts: Fix alignment bug in allocator start code
6
    
7
    Bug never released.
8
9
diff --git erts/emulator/beam/erl_alloc_util.c erts/emulator/beam/erl_alloc_util.c
10
index 1fdee4d..00b87ac 100644
11
--- erts/emulator/beam/erl_alloc_util.c
12
+++ erts/emulator/beam/erl_alloc_util.c
13
@@ -372,6 +372,8 @@ do {										\
14
 
15
 #define ERTS_CRR_ALCTR_FLG_IN_POOL	(((erts_aint_t) 1) << 0)
16
 #define ERTS_CRR_ALCTR_FLG_BUSY		(((erts_aint_t) 1) << 1)
17
+#define ERTS_CRR_ALCTR_FLG_MASK (ERTS_CRR_ALCTR_FLG_IN_POOL | \
18
+                                 ERTS_CRR_ALCTR_FLG_BUSY)
19
 
20
 #ifdef ERTS_SMP
21
 #define SBC_HEADER_SIZE	   						\
22
@@ -1404,14 +1406,14 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
23
 
24
 	    if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock
25
 		&& pref_allctr->thread_safe) {
26
-		used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
27
+		used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
28
 		if (pref_allctr == used_allctr) {
29
 		    erts_mtx_lock(&pref_allctr->mutex);
30
 		    locked_pref_allctr = 1;
31
 		}
32
 	    }
33
 
34
-	    while ((iallctr & ((~FLG_MASK)|ERTS_CRR_ALCTR_FLG_IN_POOL))
35
+	    while ((iallctr & ((~ERTS_CRR_ALCTR_FLG_MASK)|ERTS_CRR_ALCTR_FLG_IN_POOL))
36
 		   == (((erts_aint_t) pref_allctr)|ERTS_CRR_ALCTR_FLG_IN_POOL)) {
37
 		erts_aint_t act;
38
 
39
@@ -1426,7 +1428,7 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
40
 		iallctr = act;
41
 	    }
42
 
43
-	    used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
44
+	    used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
45
 
46
 	    if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock) {
47
 		if (locked_pref_allctr && used_allctr != pref_allctr) {
48
@@ -1436,16 +1438,16 @@ get_used_allctr(Allctr_t *pref_allctr, int pref_lock, void *p, UWord *sizep,
49
 	    }
50
 
51
 	    ERTS_ALC_CPOOL_ASSERT(
52
-		(((iallctr & ~FLG_MASK) == (erts_aint_t) pref_allctr)
53
-		 ? (((iallctr & FLG_MASK) == ERTS_CRR_ALCTR_FLG_IN_POOL)
54
-		    || ((iallctr & FLG_MASK) == 0))
55
+		(((iallctr & ~ERTS_CRR_ALCTR_FLG_MASK) == (erts_aint_t) pref_allctr)
56
+		 ? (((iallctr & ERTS_CRR_ALCTR_FLG_MASK) == ERTS_CRR_ALCTR_FLG_IN_POOL)
57
+		    || ((iallctr & ERTS_CRR_ALCTR_FLG_MASK) == 0))
58
 		 : 1));
59
 
60
 	    return used_allctr;
61
 	}
62
     }
63
 
64
-    used_allctr = (Allctr_t *) (iallctr & ~FLG_MASK);
65
+    used_allctr = (Allctr_t *) (iallctr & ~ERTS_CRR_ALCTR_FLG_MASK);
66
 
67
     if (ERTS_ALC_TS_PREF_LOCK_IF_USED == pref_lock
68
 	&& used_allctr == pref_allctr
69
@@ -1776,7 +1778,7 @@ handle_delayed_dealloc(Allctr_t *allctr,
70
 	    ERTS_ALC_CPOOL_ASSERT(allctr == crr->cpool.orig_allctr);
71
 	    ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr)
72
 				  != (erts_smp_atomic_read_nob(&crr->allctr)
73
-				      & ~FLG_MASK));
74
+				      & ~ERTS_CRR_ALCTR_FLG_MASK));
75
 
76
 	    erts_smp_atomic_set_nob(&crr->allctr, ((erts_aint_t) allctr));
77
 
78
@@ -2919,7 +2921,7 @@ cpool_fetch(Allctr_t *allctr, UWord size)
79
 #ifdef ERTS_ALC_CPOOL_DEBUG
80
 	    ERTS_ALC_CPOOL_ASSERT(erts_smp_atomic_xchg_nob(&crr->allctr,
81
 							   ((erts_aint_t) allctr))
82
-				  == (((erts_aint_t) allctr) & ~FLG_MASK));
83
+				  == (((erts_aint_t) allctr) & ~ERTS_CRR_ALCTR_FLG_MASK));
84
 #else
85
 	    erts_smp_atomic_set_nob(&crr->allctr, ((erts_aint_t) allctr));
86
 #endif
87
@@ -2961,7 +2963,7 @@ cpool_fetch(Allctr_t *allctr, UWord size)
88
 					     (erts_aint_t) allctr,
89
 					     exp);
90
 	    if (act == exp) {
91
-		cpool_delete(allctr, ((Allctr_t *) (act & ~FLG_MASK)), crr);
92
+		cpool_delete(allctr, ((Allctr_t *) (act & ~ERTS_CRR_ALCTR_FLG_MASK)), crr);
93
 		return crr;
94
 	    }
95
 	}
96
@@ -3056,7 +3058,7 @@ schedule_dealloc_carrier(Allctr_t *allctr, Carrier_t *crr)
97
 	ERTS_ALC_CPOOL_ASSERT(crr == FIRST_BLK_TO_MBC(allctr, blk));
98
 	ERTS_ALC_CPOOL_ASSERT(((erts_aint_t) allctr)
99
 			      == (erts_smp_atomic_read_nob(&crr->allctr)
100
-				  & ~FLG_MASK));
101
+				  & ~ERTS_CRR_ALCTR_FLG_MASK));
102
 
103
 	if (ddq_enqueue(&orig_allctr->dd.q, BLK2UMEM(blk), cinit))
104
 	    erts_alloc_notify_delayed_dealloc(orig_allctr->ix);
105
@@ -5422,6 +5424,11 @@ erts_alcu_start(Allctr_t *allctr, AllctrInit_t *init)
106
 {
107
     /* erts_alcu_start assumes that allctr has been zeroed */
108
 
109
+    if (((UWord)allctr & ERTS_CRR_ALCTR_FLG_MASK) != 0) {
110
+        erl_exit(ERTS_ABORT_EXIT, "%s:%d:erts_alcu_start: Alignment error\n",
111
+                 __FILE__, __LINE__);
112
+    }
113
+
114
     if (!initialized)
115
 	goto error;
116
 

Return to bug 213515