diff options
-rw-r--r-- | lang/erlang-riak/files/patch-commit-5a00e72 | 116 |
1 files changed, 116 insertions, 0 deletions
diff --git a/lang/erlang-riak/files/patch-commit-5a00e72 b/lang/erlang-riak/files/patch-commit-5a00e72 new file mode 100644 index 000000000000..0d58d42dd211 --- /dev/null +++ b/lang/erlang-riak/files/patch-commit-5a00e72 @@ -0,0 +1,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; + |