From 316e6894d6d432be763593b2e8ff816f413264dd Mon Sep 17 00:00:00 2001 From: Helmut Eller Date: Fri, 24 May 2024 15:49:23 +0200 Subject: [PATCH 1/2] For igc_xpalloc_exact, make PA an in-out parameter Because igc_xpalloc_exact uses mps_arena_release the scan_area callback may be called before igc_xpalloc_exact returns. With an in-out parameter, the client has the option to receive the new address before the igc_xpalloc_exact returns. * src/igc.h (igc_xpalloc_exact): Change the type of PA. * src/igc.c (igc_xpalloc_exact): Implement the new protocol. * src/print.c (grow_pp_stack, grow_print_stack): Update accordingly. --- src/igc.c | 11 ++++++----- src/igc.h | 6 +++--- src/print.c | 8 ++++---- 3 files changed, 13 insertions(+), 12 deletions(-) diff --git a/src/igc.c b/src/igc.c index dc4512713f7..4f22221e952 100644 --- a/src/igc.c +++ b/src/igc.c @@ -2416,13 +2416,14 @@ scan_xpalloced (mps_ss_t ss, void *start, void *end, void *closure) return scan_area ((struct igc_opaque *)ss, start, end, scan_cell); } -void * -igc_xpalloc_exact (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min, - ptrdiff_t nitems_max, ptrdiff_t item_size, - igc_scan_area_t scan_area) +void +igc_xpalloc_exact (void **pa_cell, ptrdiff_t *nitems, + ptrdiff_t nitems_incr_min, ptrdiff_t nitems_max, + ptrdiff_t item_size, igc_scan_area_t scan_area) { IGC_WITH_PARKED (global_igc) { + void *pa = *pa_cell; if (pa) { struct igc_root_list *r = root_find (pa); @@ -2433,8 +2434,8 @@ igc_xpalloc_exact (void *pa, ptrdiff_t *nitems, ptrdiff_t nitems_incr_min, char *end = (char *)pa + *nitems * item_size; root_create (global_igc, pa, end, mps_rank_exact (), scan_xpalloced, scan_area, false); + *pa_cell = pa; } - return pa; } void * diff --git a/src/igc.h b/src/igc.h index fb37ce22e22..5b97787916c 100644 --- a/src/igc.h +++ b/src/igc.h @@ -84,9 +84,9 @@ #define EMACS_IGC_H typedef igc_scan_result_t (*igc_scan_area_t) (struct igc_opaque *, void *start, void *end, igc_scan_cell_t fun); -void *igc_xpalloc_exact (void *pa, ptrdiff_t *nitems, - ptrdiff_t nitems_incr_min, ptrdiff_t nitems_max, - ptrdiff_t item_size, igc_scan_area_t scan); +void igc_xpalloc_exact (void **pa_cell, ptrdiff_t *nitems, + ptrdiff_t nitems_incr_min, ptrdiff_t nitems_max, + ptrdiff_t item_size, igc_scan_area_t scan); void *igc_xnrealloc_ambig (void *pa, ptrdiff_t nitems, ptrdiff_t item_size); diff --git a/src/print.c b/src/print.c index c87597be899..5aec73c15e3 100644 --- a/src/print.c +++ b/src/print.c @@ -1359,8 +1359,8 @@ grow_pp_stack (void) struct print_pp_stack *ps = &ppstack; eassert (ps->sp == ps->size); #ifdef HAVE_MPS - ps->stack = igc_xpalloc_exact (ps->stack, &ps->size, 1, -1, - sizeof *ps->stack, scan_ppstack); + igc_xpalloc_exact ((void **)&ppstack.stack, &ps->size, 1, -1, + sizeof *ps->stack, scan_ppstack); #else ps->stack = xpalloc (ps->stack, &ps->size, 1, -1, sizeof *ps->stack); #endif @@ -2273,8 +2273,8 @@ grow_print_stack (void) struct print_stack *ps = &prstack; eassert (ps->sp == ps->size); #ifdef HAVE_MPS - ps->stack = igc_xpalloc_exact (ps->stack, &ps->size, 1, -1, - sizeof *ps->stack, scan_prstack); + igc_xpalloc_exact ((void **)&prstack.stack, &ps->size, 1, -1, + sizeof *ps->stack, scan_prstack); #else ps->stack = xpalloc (ps->stack, &ps->size, 1, -1, sizeof *ps->stack); #endif -- 2.39.2