From fe1731519e95a4d2e52364b550fe5cd4df7e7bba Mon Sep 17 00:00:00 2001 From: "hyunghwan.chung" Date: Sun, 4 Feb 2018 03:53:19 +0000 Subject: [PATCH] reordered actions in moo_fini() --- moo/lib/main.c | 15 ++++++++++++++- moo/lib/moo.c | 43 +++++++++++++++++++++++++++++-------------- 2 files changed, 43 insertions(+), 15 deletions(-) diff --git a/moo/lib/main.c b/moo/lib/main.c index 894e725..23caefe 100644 --- a/moo/lib/main.c +++ b/moo/lib/main.c @@ -2069,6 +2069,8 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str) cm = moo_findbcharinbcstr (xstr, ','); if (cm) { + /* i duplicate this string for open() below as open() doesn't + * accept a length-bounded string */ xstr = moo_dupbchars (moo, str, moo_countbcstr(str)); if (!xstr) { @@ -2105,6 +2107,13 @@ static int handle_logopt (moo_t* moo, const moo_bch_t* str) else if (moo_compbcstr(flt, "warn+") == 0) xtn->logmask |= MOO_LOG_FATAL | MOO_LOG_ERROR | MOO_LOG_WARN; else if (moo_compbcstr(flt, "info+") == 0) xtn->logmask |= MOO_LOG_FATAL | MOO_LOG_ERROR | MOO_LOG_WARN | MOO_LOG_INFO; else if (moo_compbcstr(flt, "debug+") == 0) xtn->logmask |= MOO_LOG_FATAL | MOO_LOG_ERROR | MOO_LOG_WARN | MOO_LOG_INFO | MOO_LOG_DEBUG; + + else + { + fprintf (stderr, "ERROR: unknown log option value - %s\n", flt); + if (str != xstr) moo_freemem (moo, xstr); + return -1; + } } while (cm); @@ -2150,7 +2159,11 @@ static int handle_dbgopt (moo_t* moo, const moo_bch_t* str) len = cm? (cm - flt): moo_countbcstr(flt); if (moo_compbcharsbcstr (flt, len, "gc") == 0) dbgopt |= MOO_DEBUG_GC; else if (moo_compbcharsbcstr (flt, len, "bigint") == 0) dbgopt |= MOO_DEBUG_BIGINT; - /* TODO: error handling for unknown options */ + else + { + fprintf (stderr, "ERROR: unknown debug option value - %.*s\n", (int)len, flt); + return -1; + } } while (cm); diff --git a/moo/lib/moo.c b/moo/lib/moo.c index f07d49d..ec7256b 100644 --- a/moo/lib/moo.c +++ b/moo/lib/moo.c @@ -168,6 +168,35 @@ void moo_fini (moo_t* moo) moo_cb_t* cb; moo_oow_t i; + moo_rbt_walk (&moo->modtab, unload_module, moo); /* unload all modules */ + moo_rbt_fini (&moo->modtab); + + if (moo->log.ptr) + { + /* flush pending log messages just in case. */ + moo->vmprim.log_write (moo, moo->log.last_mask, moo->log.ptr, moo->log.len); + } + + for (cb = moo->cblist; cb; cb = cb->next) + { + /* execute callbacks for finalization */ + if (cb->fini) cb->fini (moo); + } + + if (moo->log.ptr) + { + /* flush pending log message that could be generated by the fini + * callbacks. however, the actual logging might not be produced at + * this point because one of the callbacks could arrange to stop + * logging */ + moo->vmprim.log_write (moo, moo->log.last_mask, moo->log.ptr, moo->log.len); + } + + /* deregister all callbacks */ + while (moo->cblist) moo_deregcb (moo, moo->cblist); + + /* free up internal data structures. this is done after all callbacks + * are completed */ if (moo->sem_list) { moo_freemem (moo, moo->sem_list); @@ -203,23 +232,12 @@ void moo_fini (moo_t* moo) moo->proc_map_free_last = -1; } - moo_rbt_walk (&moo->modtab, unload_module, moo); /* unload all modules */ - moo_rbt_fini (&moo->modtab); - - for (cb = moo->cblist; cb; cb = cb->next) - { - if (cb->fini) cb->fini (moo); - } - /* TOOD: persistency? storing objects to image file? */ moo_killheap (moo, moo->newheap); moo_killheap (moo, moo->curheap); moo_killheap (moo, moo->permheap); - /* deregister all callbacks */ - while (moo->cblist) moo_deregcb (moo, moo->cblist); - for (i = 0; i < MOO_COUNTOF(moo->sbuf); i++) { if (moo->sbuf[i].ptr) @@ -233,9 +251,6 @@ void moo_fini (moo_t* moo) if (moo->log.ptr) { - /* make sure to flush your log message */ -/* TODO: flush unwritten message */ - moo_freemem (moo, moo->log.ptr); moo->log.capa = 0; moo->log.len = 0;