Separate notifiers 34/268634/5
authorUnsung Lee <unsung.lee@samsung.com>
Tue, 28 Dec 2021 09:15:51 +0000 (18:15 +0900)
committerHyotaek Shim <hyotaek.shim@samsung.com>
Fri, 31 Dec 2021 06:42:52 +0000 (06:42 +0000)
Change-Id: Idb97d63a168a4026eb71c9d1b44977b09c2030bc
Signed-off-by: Unsung Lee <unsung.lee@samsung.com>
src/common/notifier.c
tests/cmocka-core.c

index 61b85ee..d5e82b2 100644 (file)
 #include <glib.h>
 
 struct resourced_notifier {
-       enum notifier_type status;
+//     enum notifier_type status;
        int (*func)(void *data);
 };
 
-static GSList *resourced_notifier_list;
+static GSList *resourced_notifier_list[RESOURCED_NOTIFIER_MAX];
 
-#define FIND_NOTIFIER(a, b, d, e, f) \
+#define FIND_NOTIFIER(a, b, d, f) \
        gslist_for_each(a, b, d) \
-               if (e == d->e && f == (d->f))
+               if (f == (d->f))
 
 int register_notifier(enum notifier_type status, int (*func)(void *data))
 {
        GSList *n;
        struct resourced_notifier *notifier;
 
-       _D("%d, %p", status, func);
 
        if (!func) {
                _E("invalid func address!");
                return -EINVAL;
        }
 
-       FIND_NOTIFIER(resourced_notifier_list, n, notifier, status, func) {
+       if(status >= RESOURCED_NOTIFIER_MAX ||
+          status < RESOURCED_NOTIFIER_APP_LAUNCH) {
+               _E("invalid status!");
+               return -EINVAL;
+       }
+
+       FIND_NOTIFIER(resourced_notifier_list[status], n, notifier, func) {
                _E("function is already registered! [%d, %p]",
                    status, func);
                return -EINVAL;
@@ -62,11 +67,12 @@ int register_notifier(enum notifier_type status, int (*func)(void *data))
                return -ENOMEM;
        }
 
-       notifier->status = status;
+//     notifier->status = status;
        notifier->func = func;
 
-       resourced_notifier_list = g_slist_append(resourced_notifier_list, notifier);
+       resourced_notifier_list[status] = g_slist_append(resourced_notifier_list[status], notifier);
 
+       _D("[status: %d] %p is registered", status, func);
        return 0;
 }
 
@@ -80,13 +86,21 @@ int unregister_notifier(enum notifier_type status, int (*func)(void *data))
                return -EINVAL;
        }
 
-       FIND_NOTIFIER(resourced_notifier_list, n, notifier, status, func) {
+       if(status >= RESOURCED_NOTIFIER_MAX ||
+          status < RESOURCED_NOTIFIER_APP_LAUNCH) {
+               _E("invalid status!");
+               return -EINVAL;
+       }
+
+       FIND_NOTIFIER(resourced_notifier_list[status], n, notifier, func) {
                _I("[%d, %p]", status, func);
-               resourced_notifier_list = g_slist_remove(resourced_notifier_list, notifier);
+               resourced_notifier_list[status] = g_slist_remove(resourced_notifier_list[status], notifier);
                free(notifier);
+               return 0;
        }
 
-       return 0;
+       _E("[%d, %p] is not registered!", status, func);
+       return -EINVAL;
 }
 
 void resourced_notify(enum notifier_type status, void *data)
@@ -94,12 +108,12 @@ void resourced_notify(enum notifier_type status, void *data)
        GSList *iter;
        struct resourced_notifier *notifier;
 
-       gslist_for_each_item(iter, resourced_notifier_list) {
+       gslist_for_each_item(iter, resourced_notifier_list[status]) {
                notifier = (struct resourced_notifier *)iter->data;
-               if (status == notifier->status) {
+//             if (status == notifier->status) {
                        if (notifier->func)
                                notifier->func(data);
-               }
+//             }
        }
 }
 
@@ -107,14 +121,19 @@ static int notifier_exit(void *data)
 {
        GSList *iter;
        /* Deinitialize in reverse order */
-       GSList *reverse_list = g_slist_reverse(resourced_notifier_list);
        struct resourced_notifier *notifier;
 
-       gslist_for_each_item(iter, reverse_list) {
-               notifier = (struct resourced_notifier *)iter->data;
-               resourced_notifier_list = g_slist_remove(resourced_notifier_list, notifier);
-               free(notifier);
+       for(int status = RESOURCED_NOTIFIER_APP_LAUNCH;
+               status < RESOURCED_NOTIFIER_MAX; status++) {
+               GSList *reverse_list = g_slist_reverse(resourced_notifier_list[status]);
+               gslist_for_each_item(iter, reverse_list) {
+                       notifier = (struct resourced_notifier *)iter->data;
+                       resourced_notifier_list[status] =
+                               g_slist_remove(resourced_notifier_list[status], notifier);
+                       free(notifier);
+               }
        }
+
        return RESOURCED_ERROR_NONE;
 }
 
index 71105fe..08826a1 100644 (file)
@@ -42,7 +42,7 @@ GSList *__real_g_slist_append(GSList *list, gpointer data);
 GSList *__real_g_slist_remove(GSList *list, gconstpointer data);
 
 struct resourced_notifier {
-       enum notifier_type status;
+//     enum notifier_type status;
        noti_cb func;
 };
 
@@ -123,7 +123,7 @@ GSList *__wrap_g_slist_append(GSList *list, gpointer data)
        int t = mock_type(int);
        void *f = mock_ptr_type(void *);
 
-       assert(t == (int) notifier->status);
+//     assert(t == (int) notifier->status);
        assert(f == (void*) notifier->func);
 
        (void) t;