From aa40b5c9434ed8e5a2888903ad1e0a71f438e7ea Mon Sep 17 00:00:00 2001 From: Hwankyu Jhun Date: Thu, 22 Aug 2019 18:45:53 +0900 Subject: [PATCH] Prevent duplicated function call Event if the current event data is equal to the previous event data, the changed callback function is called. This patch checks whether the previous event data is equal to the current event data or not. Change-Id: I6b8333f3fafbe741f57891377495a2a9dba93556 Signed-off-by: Hwankyu Jhun --- src/base/appcore_base.c | 77 +++++++++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 75 insertions(+), 2 deletions(-) diff --git a/src/base/appcore_base.c b/src/base/appcore_base.c index 3795ee3..b45ddf9 100644 --- a/src/base/appcore_base.c +++ b/src/base/appcore_base.c @@ -67,6 +67,7 @@ typedef struct _appcore_base_event_node { int type; appcore_base_event_cb cb; void *data; + void *prev_event; } appcore_base_event_node; typedef struct _appcore_base_rotation { @@ -129,6 +130,70 @@ appcore_base_tizen_profile_t appcore_base_get_tizen_profile(void) return profile; } +static int __compare_event(void *prev_event, void *curr_event, int type) +{ + char *curr_strval; + char *prev_strval; + int curr_intval; + int prev_intval; + int ret = -1; + + switch (type) { + case APPCORE_BASE_EVENT_LOW_MEMORY: + case APPCORE_BASE_EVENT_LOW_BATTERY: + case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED: + case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE: + prev_intval = GPOINTER_TO_INT(prev_event); + curr_intval = *(int *)curr_event; + if (prev_intval == curr_intval) + ret = 0; + break; + case APPCORE_BASE_EVENT_LANG_CHANGE: + case APPCORE_BASE_EVENT_REGION_CHANGE: + prev_strval = prev_event; + curr_strval = curr_event; + if (prev_strval && curr_strval && + !strcmp(prev_strval, curr_strval)) + ret = 0; + break; + default: + break; + } + + return ret; +} + +static void __unset_prev_event(void **prev_event, int type) +{ + if (type == APPCORE_BASE_EVENT_LANG_CHANGE || + type == APPCORE_BASE_EVENT_REGION_CHANGE) + free(*prev_event); + *prev_event = NULL; +} + +static void __set_prev_event(void **prev_event, void *curr_event, int type) +{ + int curr_intval; + char *curr_strval; + + switch (type) { + case APPCORE_BASE_EVENT_LOW_MEMORY: + case APPCORE_BASE_EVENT_LOW_BATTERY: + case APPCORE_BASE_EVENT_DEVICE_ORIENTATION_CHANGED: + case APPCORE_BASE_EVENT_SUSPENDED_STATE_CHANGE: + curr_intval = *(int *)curr_event; + *prev_event = GINT_TO_POINTER(curr_intval); + break; + case APPCORE_BASE_EVENT_LANG_CHANGE: + case APPCORE_BASE_EVENT_REGION_CHANGE: + curr_strval = curr_event; + if (curr_strval) + *prev_event = strdup(curr_strval); + break; + default: + break; + } +} static void __invoke_callback(void *event, int type) { @@ -136,10 +201,16 @@ static void __invoke_callback(void *event, int type) while (iter) { appcore_base_event_node *node = iter->data; + iter = g_list_next(iter); - if (node->type == type) + if (node->type != type) + continue; + + if (__compare_event(node->prev_event, event, type)) { node->cb(event, node->data); - iter = g_list_next(iter); + __unset_prev_event(&node->prev_event, type); + __set_prev_event(&node->prev_event, event, type); + } } } @@ -1338,6 +1409,7 @@ EXPORT_API appcore_base_event_h appcore_base_add_event(enum appcore_base_event e node->cb = cb; node->type = event; node->data = data; + node->prev_event = NULL; __events = g_list_append(__events, node); return node; @@ -1353,6 +1425,7 @@ EXPORT_API int appcore_base_remove_event(appcore_base_event_h handle) event = node->type; __events = g_list_remove(__events, node); + __unset_prev_event(&node->prev_event, event); free(node); if (__context.dirty && !__exist_callback(event)) { if (__context.ops.unset_event) -- 2.7.4