From f8f300e4e233e29a078556d261e401d40fa2d852 Mon Sep 17 00:00:00 2001 From: Sung-jae Park Date: Fri, 1 Nov 2013 23:04:45 +0900 Subject: [PATCH] Add LOOP_DETECTOR macro Change-Id: Id1c112665bb479a70543e6592d6554172818dd58 --- CMakeLists.txt | 1 + src/main.c | 30 +++++++++++ src/so_handler.c | 161 +++++++++++++++++++++++++++++++++++++++++++++++++++---- 3 files changed, 182 insertions(+), 10 deletions(-) diff --git a/CMakeLists.txt b/CMakeLists.txt index f41bbf3..89f1c0f 100644 --- a/CMakeLists.txt +++ b/CMakeLists.txt @@ -52,6 +52,7 @@ ADD_DEFINITIONS("-DNDEBUG") #ADD_DEFINITIONS("-D_ENABLE_MCHECK") ADD_DEFINITIONS("-DLOG_TAG=\"DATA_PROVIDER_SLAVE\"") ADD_DEFINITIONS("-D_USE_ECORE_TIME_GET") +ADD_DEFINITIONS("-D_LOOP_DETECTOR") ADD_DEFINITIONS(${pkg_CFLAGS}) diff --git a/src/main.c b/src/main.c index 4599232..6718cfb 100644 --- a/src/main.c +++ b/src/main.c @@ -70,6 +70,9 @@ static struct info { int (*heap_monitor_add_target)(const char *name); int (*heap_monitor_del_target)(const char *name); void *heap_monitor; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + Ecore_Timer *loop_detector; +#endif } s_info = { .font_name = NULL, .font_size = DEFAULT_FONT_SIZE, @@ -78,6 +81,9 @@ static struct info { .heap_monitor_add_target = NULL, .heap_monitor_del_target = NULL, .heap_monitor = NULL, +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + .loop_detector = NULL, +#endif }; static void update_font_cb(void *data) @@ -208,6 +214,16 @@ static void time_changed_cb(keynode_t *node, void *user_data) lb_system_event_all(LB_SYS_EVENT_TIME_CHANGED); } +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) +static Eina_Bool loop_detector_cb(void *data) +{ + static unsigned int accumulator; + DbgPrint("Accumulated counter: %d\n", accumulator); + accumulator++; + return ECORE_CALLBACK_RENEW; +} +#endif + static bool app_create(void *data) { int ret; @@ -257,6 +273,13 @@ static bool app_create(void *data) font_changed_cb(NULL, NULL); font_size_cb(SYSTEM_SETTINGS_KEY_FONT_SIZE, NULL); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + s_info.loop_detector = ecore_timer_add(10.0f, loop_detector_cb, NULL); + if (!s_info.loop_detector) { + ErrPrint("Unable to add timer for detecting infinite loop\n"); + } +#endif return TRUE; } @@ -264,6 +287,13 @@ static void app_terminate(void *data) { int ret; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + if (s_info.loop_detector) { + ecore_timer_del(s_info.loop_detector); + s_info.loop_detector = NULL; + } +#endif + ret = lb_delete_all_deleteme(); DbgPrint("Delete all deleteme: %d\n", ret); diff --git a/src/so_handler.c b/src/so_handler.c index 64f4342..0d45ade 100644 --- a/src/so_handler.c +++ b/src/so_handler.c @@ -108,22 +108,30 @@ static inline char *so_path_alloc(const char *pkgname) static void delete_livebox(struct so_item *item) { + int ret; + + fault_mark_call(item->pkgname, "finalize", __func__, USE_ALARM, DEFAULT_LIFE_TIMER); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + if (item->adaptor.finalize) { - int ret; - fault_mark_call(item->pkgname, "finalize", __func__, USE_ALARM, DEFAULT_LIFE_TIMER); ret = item->adaptor.finalize(item->pkgname); - fault_unmark_call(item->pkgname, "finalize", __func__, USE_ALARM); - - ErrPrint("Package %s, finalize returns %d\n", item->pkgname, ret); } else if (item->livebox.finalize) { - int ret; - fault_mark_call(item->pkgname, "finalize", __func__, USE_ALARM, DEFAULT_LIFE_TIMER); ret = item->livebox.finalize(); - fault_unmark_call(item->pkgname, "finalize", __func__, USE_ALARM); - - ErrPrint("Package %s, finalize returns %d\n", item->pkgname, ret); + } else { + ErrPrint("%s has no finalize\n", item->pkgname); + ret = -ENOSYS; } +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + + fault_unmark_call(item->pkgname, "finalize", __func__, USE_ALARM); + ErrPrint("Package %s, finalize returns %d\n", item->pkgname, ret); + main_heap_monitor_del_target(item->so_fname); if (dlclose(item->handle) != 0) { ErrPrint("dlclose: %s\n", dlerror()); @@ -272,7 +280,17 @@ static struct so_item *new_adaptor(const char *pkgname, const char *abi) if (item->adaptor.initialize) { int ret; fault_mark_call(pkgname, "initialize", __func__, USE_ALARM, DEFAULT_LIFE_TIMER); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + ret = item->adaptor.initialize(pkgname); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(pkgname, "initialize", __func__, USE_ALARM); if (ret < 0) { ErrPrint("Failed to initialize package %s\n", pkgname); @@ -427,7 +445,17 @@ static struct so_item *new_livebox(const char *pkgname) if (item->livebox.initialize) { int ret; fault_mark_call(pkgname, "initialize", __func__, USE_ALARM, DEFAULT_LIFE_TIMER); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + ret = item->livebox.initialize(pkgname); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(pkgname, "initialize", __func__, USE_ALARM); if (ret < 0) { ErrPrint("Failed to initialize package %s\n", pkgname); @@ -572,6 +600,10 @@ HAPI int so_create(const char *pkgname, const char *id, const char *content_info fault_mark_call(pkgname, id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_CREATE; if (item->adaptor.create) { ret = item->adaptor.create(pkgname, util_uri_to_path(id), content_info, cluster, category); @@ -582,6 +614,10 @@ HAPI int so_create(const char *pkgname, const char *id, const char *content_info } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(pkgname, id, __func__, USE_ALARM); if (ret < 0) { @@ -613,6 +649,10 @@ HAPI int so_destroy(struct instance *inst) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_DESTROY; if (item->adaptor.destroy) { ret = item->adaptor.destroy(item->pkgname, util_uri_to_path(inst->id)); @@ -623,6 +663,10 @@ HAPI int so_destroy(struct instance *inst) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); item->inst_list = eina_list_remove(item->inst_list, inst); @@ -648,6 +692,10 @@ HAPI char *so_pinup(struct instance *inst, int pinup) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_PINUP; if (item->adaptor.pinup) { ret = item->adaptor.pinup(item->pkgname, util_uri_to_path(inst->id), pinup); @@ -658,6 +706,10 @@ HAPI char *so_pinup(struct instance *inst, int pinup) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; } @@ -674,6 +726,10 @@ HAPI int so_is_pinned_up(struct instance *inst) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_IS_PINNED_UP; if (item->adaptor.is_pinned_up) { ret = item->adaptor.is_pinned_up(item->pkgname, util_uri_to_path(inst->id)); @@ -684,6 +740,10 @@ HAPI int so_is_pinned_up(struct instance *inst) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; } @@ -700,6 +760,10 @@ HAPI int so_is_updated(struct instance *inst) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_NEED_TO_UPDATE; if (item->adaptor.is_updated) { ret = item->adaptor.is_updated(item->pkgname, util_uri_to_path(inst->id)); @@ -710,6 +774,10 @@ HAPI int so_is_updated(struct instance *inst) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; @@ -727,6 +795,10 @@ HAPI int so_need_to_destroy(struct instance *inst) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_NEED_TO_DESTROY; if (item->adaptor.need_to_destroy) { ret = item->adaptor.need_to_destroy(item->pkgname, util_uri_to_path(inst->id)); @@ -737,6 +809,10 @@ HAPI int so_need_to_destroy(struct instance *inst) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; @@ -754,6 +830,10 @@ HAPI int so_update(struct instance *inst) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_UPDATE_CONTENT; if (item->adaptor.update_content) { ret = item->adaptor.update_content(item->pkgname, util_uri_to_path(inst->id)); @@ -764,6 +844,10 @@ HAPI int so_update(struct instance *inst) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; } @@ -781,6 +865,11 @@ HAPI int so_clicked(struct instance *inst, const char *event, double timestamp, fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); DbgPrint("PERF_DBOX\n"); + +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_CLICKED; if (item->adaptor.clicked) { ret = item->adaptor.clicked(item->pkgname, util_uri_to_path(inst->id), event, timestamp, x, y); @@ -791,6 +880,10 @@ HAPI int so_clicked(struct instance *inst, const char *event, double timestamp, } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; @@ -808,6 +901,10 @@ HAPI int so_script_event(struct instance *inst, const char *emission, const char fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_CONTENT_EVENT; if (item->adaptor.script_event) { ret = item->adaptor.script_event(item->pkgname, util_uri_to_path(inst->id), emission, source, event_info); @@ -818,6 +915,10 @@ HAPI int so_script_event(struct instance *inst, const char *emission, const char } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; @@ -841,6 +942,10 @@ HAPI int so_resize(struct instance *inst, int w, int h) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_RESIZE; if (item->adaptor.resize) { ret = item->adaptor.resize(item->pkgname, util_uri_to_path(inst->id), type); @@ -851,6 +956,10 @@ HAPI int so_resize(struct instance *inst, int w, int h) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; @@ -876,6 +985,10 @@ HAPI int so_create_needed(const char *pkgname, const char *cluster, const char * fault_mark_call(item->pkgname, __func__, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_NEED_TO_CREATE; if (item->adaptor.create_needed) { ret = item->adaptor.create_needed(pkgname, cluster, category); @@ -886,6 +999,10 @@ HAPI int so_create_needed(const char *pkgname, const char *cluster, const char * } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, __func__, __func__, USE_ALARM); DbgPrint("[%s] returns %d\n", pkgname, ret); @@ -917,6 +1034,10 @@ HAPI int so_change_group(struct instance *inst, const char *cluster, const char fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_CHANGE_GROUP; if (item->adaptor.change_group) { ret = item->adaptor.change_group(item->pkgname, util_uri_to_path(inst->id), cluster, category); @@ -927,6 +1048,10 @@ HAPI int so_change_group(struct instance *inst, const char *cluster, const char } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); if (ret >= 0) { free(inst->cluster); @@ -957,6 +1082,10 @@ HAPI int so_get_output_info(struct instance *inst, int *w, int *h, double *prior fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_GET_INFO; if (item->adaptor.get_output_info) { ret = item->adaptor.get_output_info(item->pkgname, util_uri_to_path(inst->id), w, h, priority, content, title); @@ -967,6 +1096,10 @@ HAPI int so_get_output_info(struct instance *inst, int *w, int *h, double *prior } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); if (ret >= 0) { inst->w = *w; @@ -1009,6 +1142,10 @@ HAPI int so_sys_event(struct instance *inst, int event) fault_mark_call(item->pkgname, inst->id, __func__, USE_ALARM, DEFAULT_LIFE_TIMER); +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + s_info.current_op = LIVEBOX_OP_SYSTEM_EVENT; if (item->adaptor.sys_event) { ret = item->adaptor.sys_event(item->pkgname, util_uri_to_path(inst->id), event); @@ -1019,6 +1156,10 @@ HAPI int so_sys_event(struct instance *inst, int event) } s_info.current_op = LIVEBOX_OP_UNKNOWN; +#if defined(_LOOP_DETECTOR) && defined(TIZEN_ENGINEER_MODE) + DbgPrint("%s\n", item->pkgname); +#endif + fault_unmark_call(item->pkgname, inst->id, __func__, USE_ALARM); return ret; } -- 2.7.4