diff --git a/src/ctxt/ctxt.c b/src/ctxt/ctxt.c index dc06acb..c21cde8 100644 --- a/src/ctxt/ctxt.c +++ b/src/ctxt/ctxt.c @@ -15,19 +15,17 @@ struct ax_ctxt* ax_new(void) { // "bootstrap" a new region - struct rgn rgn0; - rgn_init(&rgn0, SMALL); - struct rgn* rgn = rmemdup_typed(&rgn0, struct rgn, &rgn0, 1); + struct rgn* rgn = rgn_bootstrap_new(MEDIUM); // use it to make a new context struct ax_ctxt* ax = ralloc_typed(rgn, struct ax_ctxt, 1); ax__ctxt_init(ax, rgn); + rgn_pin(rgn, ax, (void*) ax__ctxt_cleanup); return ax; } void ax_free(struct ax_ctxt* ax) { if (ax != NULL) { - ax__ctxt_cleanup(ax); rgn_cleanup(ax->init_rgn); } } diff --git a/src/util/region.c b/src/util/region.c index 2a0a504..02e39ff 100644 --- a/src/util/region.c +++ b/src/util/region.c @@ -115,6 +115,15 @@ void rgn_pin(struct rgn* rgn, void* obj, void (*dtor)(void*)) rgn->pinned = pin; } +struct rgn* rgn_bootstrap_new(size_t pgsize) +{ + struct rgn tmp; + rgn_init(&tmp, pgsize); + struct rgn* ptr = ralloc_typed(&tmp, struct rgn, 1); + *ptr = tmp; + return ptr; +} + /* void rgn_print_stats(struct rgn* rgn, FILE* out) { diff --git a/src/util/region.h b/src/util/region.h index 7beba85..097429d 100644 --- a/src/util/region.h +++ b/src/util/region.h @@ -49,6 +49,10 @@ void rgn_pin(struct rgn* rgn, void* obj, void (*dtor)(void*)); * Derived utilities * -------------------------------------------------------------------------- */ +// new "self-bootstrapped" region -- the return region pointer belongs to +// itself, and will be invalidated when this region is cleared/cleaned up. +struct rgn* rgn_bootstrap_new(size_t pgsize); + #define ralloc_typed(_rgn, T, _n) \ ((T*) ralloc(_rgn, sizeof(T) * (_n)))