Fix app status callback 95/96195/3 accepted/tizen/3.0/ivi/20161110.071009 accepted/tizen/3.0/mobile/20161110.070910 accepted/tizen/3.0/tv/20161110.070933 accepted/tizen/3.0/wearable/20161110.070958 accepted/tizen/common/20161109.140350 accepted/tizen/ivi/20161110.000437 accepted/tizen/mobile/20161110.000342 accepted/tizen/tv/20161110.000404 accepted/tizen/wearable/20161110.000422 submit/tizen/20161108.071447 submit/tizen/20161109.002425 submit/tizen_3.0/20161108.071238
authorHwankyu Jhun <h.jhun@samsung.com>
Tue, 8 Nov 2016 06:28:05 +0000 (15:28 +0900)
committerHwankyu Jhun <h.jhun@samsung.com>
Tue, 8 Nov 2016 06:33:24 +0000 (15:33 +0900)
- Use GList instead of custom list

Change-Id: Ib4a887215cedbbccb8ca136883637a65727c6367
Signed-off-by: Hwankyu Jhun <h.jhun@samsung.com>
src/status.c

index e21d19b..003a6d2 100644 (file)
 #include "launch.h"
 
 typedef struct _app_status_cb_info_t {
-       int (*handler) (int status, void *data);
+       int (*handler)(int status, void *data);
        void *data;
-       struct _app_status_cb_info_t *next;
 } app_status_cb_info_t;
 
 static int (*_aul_status_listen_handler)(const char *appid, const char *pkgid,
                int pid, int status, int is_sub_app, void *data);
 static void *_aul_status_listen_data;
 
-static app_status_cb_info_t *app_status_cb;
 static int app_status = STATUS_LAUNCHING;
 extern int aul_launch_fini();
+static GList *app_status_cb_list;
 
 API int aul_status_update(int status)
 {
        int ret;
-       app_status_cb_info_t *cb = app_status_cb;
+       app_status_cb_info_t *cb;
+       GList *iter;
 
        app_status = status;
 
@@ -52,14 +52,17 @@ API int aul_status_update(int status)
                (unsigned char *)&status, sizeof(status), AUL_SOCK_NOREPLY);
 
        if (!ret) {
-               while (cb) {
-                       if (cb->handler) {
-                               if (cb->handler(app_status, cb->data) < 0)
-                                       aul_remove_status_local_cb(cb->handler, cb->data);
+               iter = g_list_first(app_status_cb_list);
+               while (iter) {
+                       cb = (app_status_cb_info_t *)iter->data;
+                       iter = g_list_next(iter);
+                       if (cb && cb->handler) {
+                               if (cb->handler(app_status, cb->data) < 0) {
+                                       app_status_cb_list = g_list_remove(
+                                                       app_status_cb_list, cb);
+                                       free(cb);
+                               }
                        }
-
-                       if(cb != NULL)
-                               cb = cb->next;
                }
        }
 
@@ -113,58 +116,51 @@ API int aul_app_get_status_for_uid(const char *appid, uid_t uid)
 
 API int aul_add_status_local_cb(int (*func)(int status, void *data), void *data)
 {
-       app_status_cb_info_t *cb = app_status_cb;
+       app_status_cb_info_t *cb;
+       GList *iter;
 
        if (func == NULL)
                return -1;
 
-       /* check known callback */
-       while (cb) {
+       iter = g_list_first(app_status_cb_list);
+       while (iter) {
+               cb = (app_status_cb_info_t *)iter->data;
                if (cb && cb->handler == func && cb->data == data) {
-                       /* already in list */
+                       _D("Already exists");
                        return 0;
                }
-               cb = cb->next;
+
+               iter = g_list_next(iter);
        }
 
        cb = (app_status_cb_info_t *)malloc(sizeof(app_status_cb_info_t));
-       if (cb == NULL)
+       if (cb == NULL) {
+               _E("out of memory");
                return -1;
+       }
 
        cb->handler = func;
        cb->data = data;
 
-       cb->next = app_status_cb;
-       app_status_cb = cb;
+       app_status_cb_list = g_list_append(app_status_cb_list, cb);
 
        return 0;
 }
 
 API int aul_remove_status_local_cb(int (*func)(int status, void *data), void *data)
 {
-       app_status_cb_info_t *cb = app_status_cb;
-       app_status_cb_info_t *tmp = NULL;
-
-       if (app_status_cb
-                && app_status_cb->handler == func
-                && app_status_cb->data == data) {
-               cb = app_status_cb->next;
-               free(app_status_cb);
-               app_status_cb = cb;
-               return 0;
-       }
+       app_status_cb_info_t *cb;
+       GList *iter;
 
-       while (cb) {
-               if (cb->next
-                        && cb->next->handler == func
-                        && cb->next->data == data) {
-                       tmp = cb->next->next;
-                       free(cb->next);
-                       cb->next = tmp;
+       iter = g_list_first(app_status_cb_list);
+       while (iter) {
+               cb = (app_status_cb_info_t *)iter->data;
+               iter = g_list_next(iter);
+               if (cb && cb->handler == func && cb->data == data) {
+                       app_status_cb_list = g_list_remove(app_status_cb_list, cb);
+                       free(cb);
                        return 0;
                }
-
-               cb = cb->next;
        }
 
        return -1;
@@ -172,16 +168,20 @@ API int aul_remove_status_local_cb(int (*func)(int status, void *data), void *da
 
 API int aul_invoke_status_local_cb(int status)
 {
-       app_status_cb_info_t *cb = app_status_cb;
-
-       while (cb) {
-               if (cb->handler) {
-                       if (cb->handler(status, cb->data) < 0)
-                               aul_remove_status_local_cb(cb->handler, cb->data);
+       app_status_cb_info_t *cb;
+       GList *iter;
+
+       iter = g_list_first(app_status_cb_list);
+       while (iter) {
+               cb = (app_status_cb_info_t *)iter->data;
+               iter = g_list_next(iter);
+               if (cb && cb->handler) {
+                       if (cb->handler(status, cb->data) < 0) {
+                               app_status_cb_list = g_list_remove(
+                                               app_status_cb_list, cb);
+                               free(cb);
+                       }
                }
-
-               if(cb != NULL)
-                       cb = cb->next;
        }
 
        return 0;