Prevent duplicated function call 23/212523/2
authorHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Aug 2019 09:45:53 +0000 (18:45 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Thu, 22 Aug 2019 10:02:38 +0000 (19:02 +0900)
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 <h.jhun@samsung.com>
src/base/appcore_base.c

index 3795ee3..b45ddf9 100644 (file)
@@ -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)