diff options
| author | take_cheeze <[email protected]> | 2014-05-08 22:19:14 +0900 |
|---|---|---|
| committer | take_cheeze <[email protected]> | 2014-05-08 22:19:14 +0900 |
| commit | 64300b2c43e040ae2cd63bd0ef72a10a54db6631 (patch) | |
| tree | 5d32debfc93c7a1511d90ca45967c7572ac5be2d /src/state.c | |
| parent | c071ad13a9df20e8e030320eef0a483bf4e64932 (diff) | |
| download | mruby-64300b2c43e040ae2cd63bd0ef72a10a54db6631.tar.gz mruby-64300b2c43e040ae2cd63bd0ef72a10a54db6631.zip | |
Add API `mrb_atexit()`.
`mrb_final_mrbgems` will be called as mrb_state atexit function.
Maybe useful in #1844.
Diffstat (limited to 'src/state.c')
| -rw-r--r-- | src/state.c | 23 |
1 files changed, 21 insertions, 2 deletions
diff --git a/src/state.c b/src/state.c index 9dd798f92..ee03c8a38 100644 --- a/src/state.c +++ b/src/state.c @@ -14,7 +14,6 @@ void mrb_init_heap(mrb_state*); void mrb_init_core(mrb_state*); -void mrb_final_core(mrb_state*); static mrb_value inspect_main(mrb_state *mrb, mrb_value mod) @@ -40,6 +39,7 @@ mrb_open_allocf(mrb_allocf f, void *ud) mrb->ud = ud; mrb->allocf = f; mrb->current_white_part = MRB_GC_WHITE_A; + mrb->atexit_stack_len = 0; #ifndef MRB_GC_FIXED_ARENA mrb->arena = (struct RBasic**)mrb_malloc(mrb, sizeof(struct RBasic*)*MRB_GC_ARENA_SIZE); @@ -221,7 +221,11 @@ mrb_free_context(mrb_state *mrb, struct mrb_context *c) void mrb_close(mrb_state *mrb) { - mrb_final_core(mrb); + mrb_int i; + + for (i = mrb->atexit_stack_len; i > 0; --i) { + mrb->atexit_stack[i - 1](mrb); + } /* free */ mrb_gc_free_gv(mrb); @@ -258,3 +262,18 @@ mrb_top_self(mrb_state *mrb) } return mrb_obj_value(mrb->top_self); } + +void +mrb_atexit(mrb_state *mrb, mrb_atexit_func f) +{ + size_t stack_size; + + stack_size = sizeof(mrb_atexit_func) * (mrb->atexit_stack_len + 1); + if (mrb->atexit_stack_len == 0) { + mrb->atexit_stack = (mrb_atexit_func*)mrb_malloc(mrb, stack_size); + } else { + mrb->atexit_stack = (mrb_atexit_func*)mrb_realloc(mrb, mrb->atexit_stack, stack_size); + } + + mrb->atexit_stack[mrb->atexit_stack_len++] = f; +} |
