From df652673febd8617d3f458a5c14478534e927940 Mon Sep 17 00:00:00 2001 From: Hosang Kim Date: Wed, 27 Jun 2018 07:50:30 -0400 Subject: [PATCH] evas: move clearing cows to right place. Summary: Evas is child of main loop now, so evas is deleted when main loop is quitted. In case of not calling evas_free() explicitly by app side, a crash occurs. So move clearing cows to below ecore_shutdown(). Test Plan: //Compile with: //gcc evas_test.c -o evas_test `pkg-config --cflags --libs ecore evas` #include #include Eina_Bool _timer_cb (void *data) { ecore_main_loop_quit(); return 0; } int main(int argc, char *argv[]) { evas_init(); Evas *evas = evas_new(); Evas_Object *obj = evas_object_box_add(evas); Evas_Object *rect = evas_object_rectangle_add(evas); evas_object_color_set(rect, 255, 255, 255, 255); evas_object_resize(rect, 300, 400); evas_object_show(rect); evas_object_box_append(obj, rect); evas_object_show(obj); ecore_timer_add(2.0, _timer_cb, NULL); ecore_main_loop_begin(); evas_shutdown(); return 0; } Reviewers: devilhorns, cedric, jpeg, id213sin, woohyun, zmike Reviewed By: zmike Subscribers: cedric, #committers, zmike Tags: #efl Differential Revision: https://phab.enlightenment.org/D6346 --- src/Makefile_Evas.am | 1 + src/lib/ecore_evas/ecore_evas.c | 2 +- src/lib/evas/canvas/evas_main.c | 20 +++++++++++--------- src/tests/evas/evas_suite.c | 1 + src/tests/evas/evas_suite.h | 1 + src/tests/evas/evas_test_new.c | 21 +++++++++++++++++++++ 6 files changed, 36 insertions(+), 10 deletions(-) create mode 100644 src/tests/evas/evas_test_new.c diff --git a/src/Makefile_Evas.am b/src/Makefile_Evas.am index 2caa195ab1..deab83005d 100644 --- a/src/Makefile_Evas.am +++ b/src/Makefile_Evas.am @@ -2434,6 +2434,7 @@ TESTS += tests/evas/evas_suite tests_evas_evas_suite_SOURCES = \ tests/evas/evas_suite.c \ tests/evas/evas_test_init.c \ +tests/evas/evas_test_new.c \ tests/evas/evas_test_object.c \ tests/evas/evas_test_object_smart.c \ tests/evas/evas_test_textblock.c \ diff --git a/src/lib/ecore_evas/ecore_evas.c b/src/lib/ecore_evas/ecore_evas.c index 52dfc36db1..88dd59ee7c 100644 --- a/src/lib/ecore_evas/ecore_evas.c +++ b/src/lib/ecore_evas/ecore_evas.c @@ -667,8 +667,8 @@ ecore_evas_shutdown(void) eina_log_domain_unregister(_ecore_evas_log_dom); _ecore_evas_log_dom = -1; - evas_shutdown(); ecore_shutdown(); + evas_shutdown(); return _ecore_evas_init_count; } diff --git a/src/lib/evas/canvas/evas_main.c b/src/lib/evas/canvas/evas_main.c index 2849f21ceb..50555c4ea1 100644 --- a/src/lib/evas/canvas/evas_main.c +++ b/src/lib/evas/canvas/evas_main.c @@ -155,9 +155,19 @@ evas_shutdown(void) #endif evas_cache_vg_shutdown(); + evas_font_path_global_clear(); + + evas_filter_shutdown(); + + evas_thread_shutdown(); + _evas_preload_thread_shutdown(); + evas_async_events_shutdown(); + evas_module_shutdown(); + + ecore_shutdown(); + _efl_gfx_map_shutdown(); - evas_font_path_global_clear(); eina_cow_del(evas_object_proxy_cow); eina_cow_del(evas_object_map_cow); eina_cow_del(evas_object_state_cow); @@ -172,17 +182,9 @@ evas_shutdown(void) evas_object_image_load_opts_cow = NULL; evas_object_image_state_cow = NULL; - evas_filter_shutdown(); eina_cow_del(evas_object_mask_cow); evas_object_mask_cow = NULL; - evas_thread_shutdown(); - _evas_preload_thread_shutdown(); - evas_async_events_shutdown(); - evas_module_shutdown(); - - ecore_shutdown(); - #ifdef BUILD_LOADER_EET eet_shutdown(); #endif diff --git a/src/tests/evas/evas_suite.c b/src/tests/evas/evas_suite.c index a5c27d5dfa..e84d23f5dc 100644 --- a/src/tests/evas/evas_suite.c +++ b/src/tests/evas/evas_suite.c @@ -10,6 +10,7 @@ static const Efl_Test_Case etc[] = { { "Evas", evas_test_init }, + { "Evas New", evas_test_new }, { "Object", evas_test_object }, { "Object Textblock", evas_test_textblock }, { "Object Text", evas_test_text }, diff --git a/src/tests/evas/evas_suite.h b/src/tests/evas/evas_suite.h index f7feb2ccbe..0da47fe13f 100644 --- a/src/tests/evas/evas_suite.h +++ b/src/tests/evas/evas_suite.h @@ -4,6 +4,7 @@ #include #include "../efl_check.h" void evas_test_init(TCase *tc); +void evas_test_new(TCase *tc); void evas_test_object(TCase *tc); void evas_test_textblock(TCase *tc); void evas_test_text(TCase *tc); diff --git a/src/tests/evas/evas_test_new.c b/src/tests/evas/evas_test_new.c new file mode 100644 index 0000000000..c95c43a230 --- /dev/null +++ b/src/tests/evas/evas_test_new.c @@ -0,0 +1,21 @@ +#ifdef HAVE_CONFIG_H +# include "config.h" +#endif + +#include + +#include + +#include "evas_suite.h" + +EFL_START_TEST(evas_free_none) +{ + Evas *evas = evas_new(); + Evas_Object *obj = evas_object_rectangle_add(evas); +} +EFL_END_TEST + +void evas_test_new(TCase *tc) +{ + tcase_add_test(tc, evas_free_none); +}