From 8e4e0f066ea4afb86247594c481fb0d795fb418a Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Wed, 29 Jan 2014 15:13:22 +0000 Subject: [PATCH] Eliminating dodgy use of *segprefdefault() which could lead to implicit calls to memcpy. Copied from Perforce Change: 184217 ServerID: perforce.ravenbrook.com --- mps/code/arenacv.c | 4 +++- mps/code/locus.c | 9 ++++++++- mps/code/mpm.h | 1 + mps/code/poolams.c | 2 +- mps/code/poolmv2.c | 2 +- mps/code/poolmvff.c | 2 +- mps/code/poolsnc.c | 2 +- 7 files changed, 16 insertions(+), 6 deletions(-) diff --git a/mps/code/arenacv.c b/mps/code/arenacv.c index 01be2dd83fe..10ef9c45314 100644 --- a/mps/code/arenacv.c +++ b/mps/code/arenacv.c @@ -261,11 +261,13 @@ static void testAllocAndIterate(Arena arena, Pool pool, AllocatorClass allocator) { AllocInfoStruct offsetRegion, gapRegion, newRegion, topRegion; - SegPrefStruct pref = *SegPrefDefault(); + SegPrefStruct pref; Count offset, gap, new; ZoneSet zone = (ZoneSet)2; int i; + SegPrefInit(&pref); + /* Testing the behaviour with various sizes of gaps in the page table. */ /* Assume the allocation strategy is first-fit. The idea of the tests is */ diff --git a/mps/code/locus.c b/mps/code/locus.c index ff8d173d2bb..e3cbef3a8a2 100644 --- a/mps/code/locus.c +++ b/mps/code/locus.c @@ -39,6 +39,13 @@ SegPref SegPrefDefault(void) return &segPrefDefault; } +/* SegPrefInit -- initialise a segment preference to the defaults */ + +void SegPrefInit(SegPref pref) +{ + mps_lib_memcpy(pref, &segPrefDefault, sizeof(SegPrefStruct)); +} + /* SegPrefExpress -- express a segment preference */ @@ -253,7 +260,7 @@ Res ChainAlloc(Seg *segReturn, Chain chain, Serial genNr, SegClass class, else zones = arena->topGen.zones; - pref = *SegPrefDefault(); /* FIXME: Ugh. Should have SegPrefInit. */ + SegPrefInit(&pref); SegPrefExpress(&pref, SegPrefCollected, NULL); SegPrefExpress(&pref, SegPrefZoneSet, &zones); res = SegAlloc(&seg, class, &pref, size, pool, withReservoirPermit, args); diff --git a/mps/code/mpm.h b/mps/code/mpm.h index 5998761e8e7..65f61c3b60c 100644 --- a/mps/code/mpm.h +++ b/mps/code/mpm.h @@ -626,6 +626,7 @@ extern Res ArenaNoExtend(Arena arena, Addr base, Size size); extern Bool SegPrefCheck(SegPref pref); extern SegPref SegPrefDefault(void); +extern void SegPrefInit(SegPref pref); extern void SegPrefExpress(SegPref pref, SegPrefKind kind, void *p); extern void LocusInit(Arena arena); diff --git a/mps/code/poolams.c b/mps/code/poolams.c index 7f93dde0c49..a854d443b98 100644 --- a/mps/code/poolams.c +++ b/mps/code/poolams.c @@ -954,7 +954,7 @@ static Res AMSBufferFill(Addr *baseReturn, Addr *limitReturn, } /* No suitable segment found; make a new one. */ - segPrefStruct = *SegPrefDefault(); + SegPrefInit(&segPrefStruct); SegPrefExpress(&segPrefStruct, SegPrefCollected, NULL); res = AMSSegCreate(&seg, pool, size, &segPrefStruct, rankSet, withReservoirPermit); diff --git a/mps/code/poolmv2.c b/mps/code/poolmv2.c index 53237d5861f..e72f3189ed2 100644 --- a/mps/code/poolmv2.c +++ b/mps/code/poolmv2.c @@ -290,7 +290,7 @@ static Res MVTInit(Pool pool, ArgList args) { ZoneSet zones; /* --- Loci needed here, what should the pref be? */ - *MVTSegPref(mvt) = *SegPrefDefault(); + SegPrefInit(MVTSegPref(mvt)); zones = ZoneSetComp(ArenaDefaultZONESET); SegPrefExpress(MVTSegPref(mvt), SegPrefZoneSet, (void *)&zones); } diff --git a/mps/code/poolmvff.c b/mps/code/poolmvff.c index d5a5f363ad3..d2c2997e725 100644 --- a/mps/code/poolmvff.c +++ b/mps/code/poolmvff.c @@ -593,7 +593,7 @@ static Res MVFFInit(Pool pool, ArgList args) return res; mvff->segPref = (SegPref)p; - *mvff->segPref = *SegPrefDefault(); + SegPrefInit(mvff->segPref); SegPrefExpress(mvff->segPref, arenaHigh ? SegPrefHigh : SegPrefLow, NULL); /* If using zoneset placement, just put it apart from the others. */ zones = ZoneSetComp(ArenaDefaultZONESET); diff --git a/mps/code/poolsnc.c b/mps/code/poolsnc.c index 49cdceeb25d..87133f55718 100644 --- a/mps/code/poolsnc.c +++ b/mps/code/poolsnc.c @@ -391,7 +391,7 @@ static Res SNCInit(Pool pool, ArgList args) snc->freeSegs = NULL; /* Use the default segpref for the pool. At least this should avoid */ /* clashes with collected pools */ - snc->segPrefStruct = *SegPrefDefault(); + SegPrefInit(&snc->segPrefStruct); snc->sig = SNCSig; AVERT(SNC, snc);