Add finalize_cb to jerry_context_data_manager_t (#2269)
This patch adds a new finalize_cb callback to jerry_context_data_manager_t. The callback is run as the very last thing in jerry_cleanup, after the VM has been torn down entirely. There was already the deinit_cb, which is run while the VM is still in the process of being torn down. The reason the deinit_cb is not always sufficient is that there may still be objects alive (because they still being referenced) that have native pointers associated with the context manager that is being deinit'ed. As a result, the free_cb's for those objects can get called *after* the associated context manager's deinit_cb is run. This makes cleanup of manager state that is depended on by the live objects impossible to do in the deinit_cb. That type of cleanup can only be done when all values have been torn down completely. JerryScript-DCO-1.0-Signed-off-by: Martijn The martijn.the@intel.com
This commit is contained in:
committed by
László Langó
parent
27939f0884
commit
35926f3f85
@@ -19,9 +19,10 @@
|
||||
|
||||
static bool test_context_data1_new_called = false;
|
||||
static bool test_context_data2_new_called = false;
|
||||
static bool test_context_data3_new_called = false;
|
||||
static bool test_context_data1_free_called = false;
|
||||
static bool test_context_data2_free_called = false;
|
||||
static bool test_context_data3_new_called = false;
|
||||
static bool test_context_data1_finalize_called = false;
|
||||
|
||||
/* Context item 1 */
|
||||
const char *string1 = "item1";
|
||||
@@ -38,12 +39,23 @@ test_context_data1_free (void *user_data_p)
|
||||
{
|
||||
test_context_data1_free_called = true;
|
||||
TEST_ASSERT ((*(const char **) user_data_p) == string1);
|
||||
TEST_ASSERT (!test_context_data1_finalize_called);
|
||||
} /* test_context_data1_free */
|
||||
|
||||
static void
|
||||
test_context_data1_finalize (void *user_data_p)
|
||||
{
|
||||
TEST_ASSERT (test_context_data1_free_called);
|
||||
TEST_ASSERT (!test_context_data1_finalize_called);
|
||||
TEST_ASSERT ((*(const char **) user_data_p) == string1);
|
||||
test_context_data1_finalize_called = true;
|
||||
} /* test_context_data1_finalize */
|
||||
|
||||
static const jerry_context_data_manager_t manager1 =
|
||||
{
|
||||
.init_cb = test_context_data1_new,
|
||||
.deinit_cb = test_context_data1_free,
|
||||
.finalize_cb = test_context_data1_finalize,
|
||||
.bytes_needed = sizeof (const char *)
|
||||
};
|
||||
|
||||
@@ -86,6 +98,7 @@ static const jerry_context_data_manager_t manager3 =
|
||||
.init_cb = test_context_data3_new,
|
||||
/* NULL is allowed: */
|
||||
.deinit_cb = NULL,
|
||||
.finalize_cb = NULL,
|
||||
.bytes_needed = 0,
|
||||
};
|
||||
|
||||
|
||||
Reference in New Issue
Block a user