From 7f67f68c1ce09cb56c5ee271a46e28b3fee7f7e3 Mon Sep 17 00:00:00 2001 From: Joshua Haberman Date: Sun, 11 Oct 2020 17:04:54 -0700 Subject: [PATCH] Shrunk the arena state that needs to be synced. --- upb/decode.c | 12 ++++-------- upb/upb.c | 11 ++++++----- 2 files changed, 10 insertions(+), 13 deletions(-) diff --git a/upb/decode.c b/upb/decode.c index b0b6105d3d..62e7c7d76b 100644 --- a/upb/decode.c +++ b/upb/decode.c @@ -141,7 +141,6 @@ static const int8_t delim_ops[37] = { typedef struct { const char *limit; /* End of delimited region or end of buffer. */ upb_arena arena; - upb_arena *orig_parent; int depth; uint32_t end_group; /* Set to field number of END_GROUP tag, if any. */ jmp_buf err; @@ -613,11 +612,9 @@ bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l, state.limit = buf + size; state.depth = 64; state.end_group = 0; - state.orig_parent = arena->parent; - state.arena = *arena; - if (arena->parent == arena) { - state.arena.parent = &state.arena; - } + state.arena.head = arena->head; + state.arena.last_size = arena->last_size; + state.arena.parent = arena; if (setjmp(state.err)) { ok = false; @@ -626,8 +623,7 @@ bool upb_decode(const char *buf, size_t size, void *msg, const upb_msglayout *l, ok = state.end_group == 0; } - *arena = state.arena; - arena->parent = state.orig_parent; + arena->head = state.arena.head; return ok; } diff --git a/upb/upb.c b/upb/upb.c index e0a68dff47..41f4463333 100644 --- a/upb/upb.c +++ b/upb/upb.c @@ -98,9 +98,9 @@ static upb_arena *arena_findroot(upb_arena *a) { return a; } -static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size) { +static void upb_arena_addblock(upb_arena *a, upb_arena *root, void *ptr, + size_t size) { mem_block *block = ptr; - upb_arena *root = arena_findroot(a); /* The block is for arena |a|, but should appear in the freelist of |root|. */ block->next = root->freelist; @@ -118,11 +118,12 @@ static void upb_arena_addblock(upb_arena *a, void *ptr, size_t size) { } static bool upb_arena_allocblock(upb_arena *a, size_t size) { + upb_arena *root = arena_findroot(a); size_t block_size = UPB_MAX(size, a->last_size * 2) + memblock_reserve; - mem_block *block = upb_malloc(a->block_alloc, block_size); + mem_block *block = upb_malloc(root->block_alloc, block_size); if (!block) return false; - upb_arena_addblock(a, block, block_size); + upb_arena_addblock(a, root, block, block_size); return true; } @@ -165,7 +166,7 @@ upb_arena *arena_initslow(void *mem, size_t n, upb_alloc *alloc) { a->freelist = NULL; a->freelist_tail = NULL; - upb_arena_addblock(a, mem, n); + upb_arena_addblock(a, a, mem, n); return a; }