From d8d5ebbe9124fe5ff92d30ccb8c8a0e934566a7c Mon Sep 17 00:00:00 2001 From: Richard Brooksby Date: Fri, 12 Feb 2016 15:22:34 +0000 Subject: [PATCH] Separating arenaenter from stack_context_begin and arenaleave from stack_context_end as they are not conceptually nested that way. Copied from Perforce Change: 189446 ServerID: perforce.ravenbrook.com --- mps/code/mpsi.c | 18 ++++++++++++++++++ mps/code/ss.h | 24 ++++++++++++------------ 2 files changed, 30 insertions(+), 12 deletions(-) diff --git a/mps/code/mpsi.c b/mps/code/mpsi.c index eb4bc63a42c..b27f26adafd 100644 --- a/mps/code/mpsi.c +++ b/mps/code/mpsi.c @@ -231,9 +231,11 @@ void mps_arena_clamp(mps_arena_t arena) void mps_arena_release(mps_arena_t arena) { + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { ArenaRelease(ArenaGlobals(arena)); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); } @@ -271,19 +273,23 @@ void mps_arena_unsafe_restore_protection(mps_arena_t arena) mps_res_t mps_arena_start_collect(mps_arena_t arena) { Res res; + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { res = ArenaStartCollect(ArenaGlobals(arena), TraceStartWhyCLIENTFULL_INCREMENTAL); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); return (mps_res_t)res; } mps_res_t mps_arena_collect(mps_arena_t arena) { Res res; + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { res = ArenaCollect(ArenaGlobals(arena), TraceStartWhyCLIENTFULL_BLOCK); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); return (mps_res_t)res; } @@ -292,9 +298,11 @@ mps_bool_t mps_arena_step(mps_arena_t arena, double multiplier) { Bool b; + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { b = ArenaStep(ArenaGlobals(arena), interval, multiplier); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); return b; } @@ -734,6 +742,7 @@ mps_res_t mps_alloc(mps_addr_t *p_o, mps_pool_t pool, size_t size) AVER(TESTT(Pool, pool)); arena = PoolArena(pool); + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { ArenaPoll(ArenaGlobals(arena)); /* .poll */ @@ -750,6 +759,7 @@ mps_res_t mps_alloc(mps_addr_t *p_o, mps_pool_t pool, size_t size) res = PoolAlloc(&p, pool, size, FALSE); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); if (res != ResOK) return (mps_res_t)res; @@ -1041,6 +1051,7 @@ mps_res_t mps_ap_fill(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size) AVER(TESTT(Buffer, buf)); arena = BufferArena(buf); + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { ArenaPoll(ArenaGlobals(arena)); /* .poll */ @@ -1053,6 +1064,7 @@ mps_res_t mps_ap_fill(mps_addr_t *p_o, mps_ap_t mps_ap, size_t size) res = BufferFill(&p, buf, size, FALSE); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); if (res != ResOK) return (mps_res_t)res; @@ -1073,6 +1085,7 @@ mps_res_t mps_ap_fill_with_reservoir_permit(mps_addr_t *p_o, mps_ap_t mps_ap, AVER(TESTT(Buffer, buf)); arena = BufferArena(buf); + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { ArenaPoll(ArenaGlobals(arena)); /* .poll */ @@ -1085,6 +1098,7 @@ mps_res_t mps_ap_fill_with_reservoir_permit(mps_addr_t *p_o, mps_ap_t mps_ap, res = BufferFill(&p, buf, size, TRUE); } STACK_CONTEXT_END(arena); + ArenaLeave(arena); if (res != ResOK) return (mps_res_t)res; @@ -1874,10 +1888,12 @@ mps_res_t mps_ap_alloc_pattern_end(mps_ap_t mps_ap, arena = BufferArena(BufferOfAP(mps_ap)); + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { res = BufferRampEnd(BufferOfAP(mps_ap)); ArenaPoll(ArenaGlobals(arena)); /* .poll */ } STACK_CONTEXT_END(arena); + ArenaLeave(arena); return (mps_res_t)res; } @@ -1892,10 +1908,12 @@ mps_res_t mps_ap_alloc_pattern_reset(mps_ap_t mps_ap) arena = BufferArena(BufferOfAP(mps_ap)); + ArenaEnter(arena); STACK_CONTEXT_BEGIN(arena) { BufferRampReset(BufferOfAP(mps_ap)); ArenaPoll(ArenaGlobals(arena)); /* .poll */ } STACK_CONTEXT_END(arena); + ArenaLeave(arena); return MPS_RES_OK; } diff --git a/mps/code/ss.h b/mps/code/ss.h index ad7ead0c751..7e20c8aac8e 100644 --- a/mps/code/ss.h +++ b/mps/code/ss.h @@ -24,23 +24,23 @@ typedef struct StackContextStruct { } StackContextStruct; -/* STACK_CONTEXT_BEGIN -- enter arena and save context */ +/* STACK_CONTEXT_BEGIN -- save context */ -#define STACK_CONTEXT_BEGIN(arena) BEGIN \ - StackContextStruct _sc; \ - ArenaEnter(arena); \ - STACK_CONTEXT_SAVE(&_sc); \ - AVER(arena->scAtArenaEnter == NULL); \ - arena->scAtArenaEnter = &_sc; \ - BEGIN +#define STACK_CONTEXT_BEGIN(arena) \ + BEGIN \ + StackContextStruct _sc; \ + STACK_CONTEXT_SAVE(&_sc); \ + AVER(arena->scAtArenaEnter == NULL); \ + arena->scAtArenaEnter = &_sc; \ + BEGIN /* STACK_CONTEXT_END -- clear context and leave arena */ -#define STACK_CONTEXT_END(arena) END; \ - AVER(arena->scAtArenaEnter != NULL); \ - arena->scAtArenaEnter = NULL; \ - ArenaLeave(arena); \ +#define STACK_CONTEXT_END(arena) \ + END; \ + AVER(arena->scAtArenaEnter != NULL); \ + arena->scAtArenaEnter = NULL; \ END