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 |
|