Delay cache recreation with a timer
authorSebastian Dransfeld <sd@tango.flipp.net>
Thu, 10 Feb 2011 14:25:33 +0000 (14:25 +0000)
committerSebastian Dransfeld <sd@tango.flipp.net>
Thu, 10 Feb 2011 14:25:33 +0000 (14:25 +0000)
SVN revision: 56911

legacy/efreet/ChangeLog
legacy/efreet/src/lib/efreet_cache.c

index 2186520..9246a08 100644 (file)
@@ -74,3 +74,4 @@
        * efreet_cache_icon -> efreet_icon for functions in efreet_icon.c
        * Fix memleak in desktop cache create
        * Pass dirs to desktop cache process as arguments
+       * Delay cache recreation with a timer
index d8a63e9..aaaf12e 100644 (file)
@@ -69,10 +69,10 @@ static const char          *desktop_cache_file = NULL;
 static Ecore_File_Monitor  *cache_monitor = NULL;
 
 static Ecore_Event_Handler *cache_exe_handler = NULL;
-static Ecore_Job           *icon_cache_job = NULL;
+static Ecore_Timer         *icon_cache_timer = NULL;
 static Ecore_Exe           *icon_cache_exe = NULL;
 static int                  icon_cache_exe_lock = -1;
-static Ecore_Job           *desktop_cache_job = NULL;
+static Ecore_Timer         *desktop_cache_timer = NULL;
 static Ecore_Exe           *desktop_cache_exe = NULL;
 static int                  desktop_cache_exe_lock = -1;
 
@@ -97,8 +97,8 @@ static Eina_Bool cache_exe_cb(void *data, int type, void *event);
 static void cache_update_cb(void *data, Ecore_File_Monitor *em,
                             Ecore_File_Event event, const char *path);
 
-static void desktop_cache_update_cache_job(void *data);
-static void icon_cache_update_cache_job(void *data);
+static Eina_Bool desktop_cache_update_cache_cb(void *data);
+static Eina_Bool icon_cache_update_cache_cb(void *data);
 static void desktop_cache_update_free(void *data, void *ev);
 static void icon_cache_update_free(void *data, void *ev);
 
@@ -187,10 +187,10 @@ efreet_cache_shutdown(void)
     cache_monitor = NULL;
 
     efreet_cache_edd_shutdown();
-    if (desktop_cache_job)
+    if (desktop_cache_timer)
     {
-        ecore_job_del(desktop_cache_job);
-        desktop_cache_job = NULL;
+        ecore_timer_del(desktop_cache_timer);
+        desktop_cache_timer = NULL;
     }
     IF_RELEASE(icon_theme_cache_file);
     if (icon_cache_exe_lock > 0)
@@ -865,9 +865,10 @@ efreet_cache_desktop_update(void)
 {
     if (!efreet_cache_update) return;
 
-    /* TODO: Make sure we don't create a lot of execs, maybe use a timer? */
-    if (desktop_cache_job) ecore_job_del(desktop_cache_job);
-    desktop_cache_job = ecore_job_add(desktop_cache_update_cache_job, NULL);
+    if (desktop_cache_timer)
+        ecore_timer_delay(desktop_cache_timer, 0.2);
+    else
+        desktop_cache_timer = ecore_timer_add(0.2, desktop_cache_update_cache_cb, NULL);
 }
 
 void
@@ -875,9 +876,10 @@ efreet_cache_icon_update(void)
 {
     if (!efreet_cache_update) return;
 
-    /* TODO: Make sure we don't create a lot of execs, maybe use a timer? */
-    if (icon_cache_job) ecore_job_del(icon_cache_job);
-    icon_cache_job = ecore_job_add(icon_cache_update_cache_job, NULL);
+    if (icon_cache_timer)
+        ecore_timer_delay(icon_cache_timer, 0.2);
+    else
+        icon_cache_timer = ecore_timer_add(0.2, icon_cache_update_cache_cb, NULL);
 }
 
 static Eina_Bool
@@ -1091,22 +1093,22 @@ error:
         free(d);
 }
 
-static void
-desktop_cache_update_cache_job(void *data __UNUSED__)
+static Eina_Bool
+desktop_cache_update_cache_cb(void *data __UNUSED__)
 {
     char file[PATH_MAX];
     struct flock fl;
     int prio;
 
-    desktop_cache_job = NULL;
+    desktop_cache_timer = NULL;
 
     /* TODO: Retry update cache later */
-    if (desktop_cache_exe_lock > 0) return;
+    if (desktop_cache_exe_lock > 0) return ECORE_CALLBACK_CANCEL;
 
     snprintf(file, sizeof(file), "%s/efreet/desktop_exec.lock", efreet_cache_home_get());
 
     desktop_cache_exe_lock = open(file, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
-    if (desktop_cache_exe_lock < 0) return;
+    if (desktop_cache_exe_lock < 0) goto error;
     efreet_fsetowner(desktop_cache_exe_lock);
     memset(&fl, 0, sizeof(struct flock));
     fl.l_type = F_WRLCK;
@@ -1131,33 +1133,33 @@ desktop_cache_update_cache_job(void *data __UNUSED__)
     ecore_exe_run_priority_set(prio);
     if (!desktop_cache_exe) goto error;
 
-    return;
-
+    return ECORE_CALLBACK_CANCEL;
 error:
     if (desktop_cache_exe_lock > 0)
     {
         close(desktop_cache_exe_lock);
         desktop_cache_exe_lock = -1;
     }
+    return ECORE_CALLBACK_CANCEL;
 }
 
-static void
-icon_cache_update_cache_job(void *data __UNUSED__)
+static Eina_Bool
+icon_cache_update_cache_cb(void *data __UNUSED__)
 {
     char file[PATH_MAX];
     struct flock fl;
     int prio;
     Eina_List **l, *l2;
 
-    icon_cache_job = NULL;
+    icon_cache_timer = NULL;
 
     /* TODO: Retry update cache later */
-    if (icon_cache_exe_lock > 0) return;
+    if (icon_cache_exe_lock > 0) return ECORE_CALLBACK_CANCEL;
 
     snprintf(file, sizeof(file), "%s/efreet/icon_exec.lock", efreet_cache_home_get());
 
     icon_cache_exe_lock = open(file, O_CREAT | O_RDWR, S_IRUSR | S_IWUSR);
-    if (icon_cache_exe_lock < 0) return;
+    if (icon_cache_exe_lock < 0) goto error;
     efreet_fsetowner(icon_cache_exe_lock);
     memset(&fl, 0, sizeof(struct flock));
     fl.l_type = F_WRLCK;
@@ -1196,7 +1198,7 @@ icon_cache_update_cache_job(void *data __UNUSED__)
     ecore_exe_run_priority_set(prio);
     if (!icon_cache_exe) goto error;
 
-    return;
+    return ECORE_CALLBACK_CANCEL;
 
 error:
     if (icon_cache_exe_lock > 0)
@@ -1204,6 +1206,7 @@ error:
         close(icon_cache_exe_lock);
         icon_cache_exe_lock = -1;
     }
+    return ECORE_CALLBACK_CANCEL;
 }
 
 static void