Merge branch 'tizen_2.2' of ssh://review.tizendev.org:29418/apps/livebox/data-provide...
[platform/framework/web/data-provider-slave.git] / src / lb.c
index cfa127b..1d82a88 100644 (file)
--- a/src/lb.c
+++ b/src/lb.c
@@ -64,7 +64,7 @@ struct item {
 
 static struct info {
        Eina_List *item_list;
-       struct item *update;
+       Eina_List *update_list;
        Eina_List *pending_list;
        Ecore_Timer *pending_timer;
        Eina_List *pd_open_pending_list;
@@ -75,7 +75,7 @@ static struct info {
        int pending_timer_freezed;
 } s_info  = {
        .item_list = NULL,
-       .update = NULL,
+       .update_list = NULL,
        .pending_list = NULL,
        .pending_timer = NULL,
        .pd_open_pending_list = NULL,
@@ -145,7 +145,7 @@ static Eina_Bool pd_open_pended_cmd_consumer_cb(void *data)
                goto cleanout;
        }
 
-       if (s_info.update) {
+       if (eina_list_data_find(s_info.update_list, item)) {
                return ECORE_CALLBACK_RENEW;
        }
 
@@ -176,7 +176,7 @@ static Eina_Bool pended_cmd_consumer_cb(void *data)
                goto cleanout;
        }
 
-       if (s_info.update || pd_is_opened(item->inst->item->pkgname) < 0) {
+       if (eina_list_data_find(s_info.update_list, item) || pd_is_opened(item->inst->item->pkgname) < 0) {
                return ECORE_CALLBACK_RENEW;
        }
 
@@ -395,8 +395,6 @@ static inline int timer_thaw(struct item *item)
 
 static void timer_freeze(struct item *item)
 {
-       struct timeval tv;
-
        if (!item->timer) {
                return;
        }
@@ -407,6 +405,10 @@ static void timer_freeze(struct item *item)
                return;
        }
 
+#if defined(_USE_ECORE_TIME_GET)
+       item->sleep_at = ecore_time_get();
+#else
+       struct timeval tv;
        if (gettimeofday(&tv, NULL) < 0) {
                ErrPrint("gettimeofday: %s\n", strerror(errno));
                tv.tv_sec = 0;
@@ -414,6 +416,7 @@ static void timer_freeze(struct item *item)
        }
 
        item->sleep_at = (double)tv.tv_sec + (double)tv.tv_usec / 1000000.0f;
+#endif
 }
 
 static inline void update_monitor_cnt(struct item *item)
@@ -433,7 +436,7 @@ static inline void update_monitor_cnt(struct item *item)
         * file update callback.
         */
        if (interval >= MINIMUM_UPDATE_INTERVAL) {
-               if (s_info.update == item) {
+               if (eina_list_data_find(s_info.update_list, item)) {
                        /*!
                         * \note
                         * If already in updating mode,
@@ -492,9 +495,7 @@ static inline int output_handler(struct item *item)
                        item->monitor = NULL;
                }
 
-               if (s_info.update == item) {
-                       s_info.update = NULL;
-               }
+               s_info.update_list = eina_list_remove(s_info.update_list, item);
 
                if (item->deleteme) {
                        provider_send_deleted(item->inst->item->pkgname, item->inst->id);
@@ -630,13 +631,13 @@ static Eina_Bool update_timeout_cb(void *data)
 
        ErrPrint("UPDATE TIMEOUT ========> %s - %s\n", item->inst->item->pkgname, item->inst->id);
 
-       if (s_info.update != item) {
+       if (!eina_list_data_find(s_info.update_list, item)) {
                ErrPrint("Updating item is not matched\n");
        }
 
        fault_unmark_call(item->inst->item->pkgname, item->inst->id, "update,crashed", NO_ALARM);
        fault_mark_call(item->inst->item->pkgname, item->inst->id, "update,timeout", NO_ALARM, DEFAULT_LIFE_TIMER);
-       s_info.update = NULL;
+       s_info.update_list = eina_list_remove(s_info.update_list, item);
 
        exit(ETIME);
        return ECORE_CALLBACK_CANCEL;
@@ -688,8 +689,12 @@ static Eina_Bool updator_cb(void *data)
                return ECORE_CALLBACK_RENEW;
        }
 
-       if (s_info.update || pd_is_opened(item->inst->item->pkgname) < 0) {
-               DbgPrint("%s is busy\n", s_info.update ? s_info.update->inst->id : item->inst->id);
+       /*!
+        * \note
+        * Check the update_list, if you want make serialized update
+        */
+       if (/*s_info.update_list || */pd_is_opened(item->inst->item->pkgname) < 0) {
+               DbgPrint("%s is busy\n", item->inst->id);
                (void)append_pending_list(item);
                return ECORE_CALLBACK_RENEW;
        }
@@ -745,7 +750,7 @@ static Eina_Bool updator_cb(void *data)
         * This should be updated after "update_monitor_cnt" function call,
         * because the update_monitor_cnt function will see the s_info.update variable,
         */
-       s_info.update = item;
+       s_info.update_list = eina_list_append(s_info.update_list, item);
 
        return ECORE_CALLBACK_RENEW;
 }
@@ -1113,9 +1118,7 @@ HAPI int lb_destroy(const char *pkgname, const char *id)
        item = eina_list_data_get(l);
        s_info.item_list = eina_list_remove_list(s_info.item_list, l);
 
-       if (s_info.update == item) {
-               s_info.update = NULL;
-       }
+       s_info.update_list = eina_list_remove(s_info.update_list, item);
 
        if (item->timer) {
                clear_from_pd_open_pending_list(item);