static Res MFSAlloc(Addr *pReturn, Pool pool, Size size, Bool withReservoirPermit) { Header f; Res res; MFS mfs; AVERT(Pool, pool); mfs = PoolPoolMFS(pool); AVERT(MFS, mfs); AVER(pReturn != NULL); AVER(size == mfs->unroundedUnitSize); AVERT(Bool, withReservoirPermit); f = mfs->freeList; /* If the free list is empty then extend the pool with a new region. */ if(f == NULL) { Addr base; if (!mfs->extendSelf) return ResLIMIT; /* Create a new region and attach it to the pool. */ res = ArenaAlloc(&base, SegPrefDefault(), mfs->extendBy, pool, withReservoirPermit); if(res != ResOK) return res; MFSExtend(pool, base, mfs->extendBy); /* The first unit in the region is now the head of the new free list. */ f = mfs->freeList; } AVER(f != NULL); /* Detach the first free unit from the free list and return its address. */ mfs->freeList = f->next; AVER(mfs->free >= mfs->unitSize); mfs->free -= mfs->unitSize; *pReturn = (Addr)f; return ResOK; }
Res SegAlloc(Seg *segReturn, SegClass klass, LocusPref pref, Size size, Pool pool, ArgList args) { Res res; Arena arena; Seg seg; Addr base; void *p; AVER(segReturn != NULL); AVERT(SegClass, klass); AVERT(LocusPref, pref); AVER(size > (Size)0); AVERT(Pool, pool); arena = PoolArena(pool); AVERT(Arena, arena); AVER(SizeIsArenaGrains(size, arena)); /* allocate the memory from the arena */ res = ArenaAlloc(&base, pref, size, pool); if (res != ResOK) goto failArena; /* allocate the segment object from the control pool */ res = ControlAlloc(&p, arena, klass->size); if (res != ResOK) goto failControl; seg = p; res = SegInit(seg, klass, pool, base, size, args); if (res != ResOK) goto failInit; EVENT5(SegAlloc, arena, seg, SegBase(seg), size, pool); *segReturn = seg; return ResOK; failInit: ControlFree(arena, seg, klass->size); failControl: ArenaFree(base, size, pool); failArena: EVENT3(SegAllocFail, arena, size, pool); return res; }
static Res MFSAlloc(Addr *pReturn, Pool pool, Size size) { MFS mfs = MustBeA(MFSPool, pool); Header f; Res res; AVER(pReturn != NULL); AVER(size == mfs->unroundedUnitSize); f = mfs->freeList; /* If the free list is empty then extend the pool with a new region. */ if(f == NULL) { Addr base; /* See design.mps.bootstrap.land.sol.pool. */ if (!mfs->extendSelf) return ResLIMIT; /* Create a new region and attach it to the pool. */ res = ArenaAlloc(&base, LocusPrefDefault(), mfs->extendBy, pool); if(res != ResOK) return res; MFSExtend(pool, base, mfs->extendBy); /* The first unit in the region is now the head of the new free list. */ f = mfs->freeList; } AVER(f != NULL); /* Detach the first free unit from the free list and return its address. */ mfs->freeList = f->next; AVER(mfs->free >= mfs->unitSize); mfs->free -= mfs->unitSize; *pReturn = (Addr)f; return ResOK; }
Addr base; void *p; AVER(segReturn != NULL); AVERT(SegClass, class); AVERT(LocusPref, pref); AVER(size > (Size)0); AVERT(Pool, pool); AVERT(Bool, withReservoirPermit); arena = PoolArena(pool); AVERT(Arena, arena); AVER(SizeIsArenaGrains(size, arena)); /* allocate the memory from the arena */ res = ArenaAlloc(&base, pref, size, pool, withReservoirPermit); if (res != ResOK) goto failArena; /* allocate the segment object from the control pool */ res = ControlAlloc(&p, arena, class->size, withReservoirPermit); if (res != ResOK) goto failControl; seg = p; seg->class = class; res = SegInit(seg, pool, base, size, withReservoirPermit, args); if (res != ResOK) goto failInit; EVENT5(SegAlloc, arena, seg, SegBase(seg), size, pool);