From 9dadfb7444a223cd9eac71b48da00b933db02716 Mon Sep 17 00:00:00 2001 From: Gareth Rees Date: Wed, 4 Jul 2018 16:31:45 +0100 Subject: [PATCH] Mfsextend now takes (base, limit) instead of (base, size) for consistency with the rest of the mps. Copied from Perforce Change: 194408 --- mps/code/arena.c | 16 +++++++++------- mps/code/poolmfs.c | 11 +++++++---- mps/code/poolmfs.h | 2 +- 3 files changed, 17 insertions(+), 12 deletions(-) diff --git a/mps/code/arena.c b/mps/code/arena.c index 1948e8b4f9c..1ab23d274e0 100644 --- a/mps/code/arena.c +++ b/mps/code/arena.c @@ -852,15 +852,16 @@ static void arenaFreePage(Arena arena, Addr base, Pool pool) static Res arenaExtendCBSBlockPool(Range pageRangeReturn, Arena arena) { - Addr pageBase; + Addr pageBase, pageLimit; Res res; res = arenaAllocPage(&pageBase, arena, ArenaCBSBlockPool(arena)); if (res != ResOK) return res; - MFSExtend(ArenaCBSBlockPool(arena), pageBase, ArenaGrainSize(arena)); + pageLimit = AddrAdd(pageBase, ArenaGrainSize(arena)); + MFSExtend(ArenaCBSBlockPool(arena), pageBase, pageLimit); - RangeInitSize(pageRangeReturn, pageBase, ArenaGrainSize(arena)); + RangeInit(pageRangeReturn, pageBase, pageLimit); return ResOK; } @@ -940,22 +941,23 @@ static void arenaFreeLandInsertSteal(Range rangeReturn, Arena arena, res = arenaFreeLandInsertExtend(rangeReturn, arena, rangeIO); if (res != ResOK) { - Addr pageBase; + Addr pageBase, pageLimit; Tract tract; AVER(ResIsAllocFailure(res)); /* Steal a page from the memory we're about to free. */ AVER(RangeSize(rangeIO) >= ArenaGrainSize(arena)); pageBase = RangeBase(rangeIO); - RangeInit(rangeIO, AddrAdd(pageBase, ArenaGrainSize(arena)), - RangeLimit(rangeIO)); + pageLimit = AddrAdd(pageBase, ArenaGrainSize(arena)); + AVER(pageLimit <= RangeLimit(rangeIO)); + RangeInit(rangeIO, pageLimit, RangeLimit(rangeIO)); /* Steal the tract from its owning pool. */ tract = TractOfBaseAddr(arena, pageBase); TractFinish(tract); TractInit(tract, ArenaCBSBlockPool(arena), pageBase); - MFSExtend(ArenaCBSBlockPool(arena), pageBase, ArenaGrainSize(arena)); + MFSExtend(ArenaCBSBlockPool(arena), pageBase, pageLimit); /* Try again. */ res = LandInsert(rangeReturn, ArenaFreeLand(arena), rangeIO); diff --git a/mps/code/poolmfs.c b/mps/code/poolmfs.c index e7fc4be5c77..21f87ad448a 100644 --- a/mps/code/poolmfs.c +++ b/mps/code/poolmfs.c @@ -166,16 +166,18 @@ static void MFSFinish(Inst inst) } -void MFSExtend(Pool pool, Addr base, Size size) +void MFSExtend(Pool pool, Addr base, Addr limit) { MFS mfs = MustBeA(MFSPool, pool); Word i, unitsPerExtent; + Size size; Size unitSize; Size ringSize; Header header = NULL; Ring mfsRing; - AVER(size == mfs->extendBy); + AVER(base < limit); + AVER(AddrOffset(base, limit) == mfs->extendBy); /* Ensure that the memory we're adding belongs to this pool. This is automatic if it was allocated using ArenaAlloc, but if the memory is @@ -193,7 +195,8 @@ void MFSExtend(Pool pool, Addr base, Size size) ringSize = SizeAlignUp(sizeof(RingStruct), MPS_PF_ALIGN); base = AddrAdd(base, ringSize); - size -= ringSize; + AVER(base < limit); + size = AddrOffset(base, limit); /* Update accounting */ mfs->total += size; @@ -255,7 +258,7 @@ static Res MFSAlloc(Addr *pReturn, Pool pool, Size size) if(res != ResOK) return res; - MFSExtend(pool, base, mfs->extendBy); + MFSExtend(pool, base, AddrAdd(base, mfs->extendBy)); /* The first unit in the region is now the head of the new free list. */ f = mfs->freeList; diff --git a/mps/code/poolmfs.h b/mps/code/poolmfs.h index 2638e8f92bd..9f112ea80f5 100644 --- a/mps/code/poolmfs.h +++ b/mps/code/poolmfs.h @@ -45,7 +45,7 @@ extern const struct mps_key_s _mps_key_MFSExtendSelf; #define MFSExtendSelf (&_mps_key_MFSExtendSelf) #define MFSExtendSelf_FIELD b -extern void MFSExtend(Pool pool, Addr base, Size size); +extern void MFSExtend(Pool pool, Addr base, Addr limit); typedef void MFSExtentVisitor(Pool pool, Addr base, Size size, void *closure);