cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=169a08c03a6a7270e185bda85d4ab9afd9063c8e

commit 169a08c03a6a7270e185bda85d4ab9afd9063c8e
Author: Al Poole <nets...@gmail.com>
Date:   Wed May 10 12:26:04 2017 -0700

    efreetd: BSD optimizations.
    
    Summary: Related to ticket T5475.
    
    Reviewers: raster, cedric
    
    Subscribers: jpeg, cedric, raster
    
    Differential Revision: https://phab.enlightenment.org/D4865
    
    Signed-off-by: Cedric BAIL <ced...@osg.samsung.com>
---
 src/bin/efreet/efreetd.c         |   9 +-
 src/bin/efreet/efreetd_cache.c   | 196 +++++++++++++++++++++++----------------
 src/bin/efreet/efreetd_cache.h   |   2 +
 src/lib/eio/eio_monitor_kevent.c |   2 +
 4 files changed, 130 insertions(+), 79 deletions(-)

diff --git a/src/bin/efreet/efreetd.c b/src/bin/efreet/efreetd.c
index ec51e0f..6f84710 100644
--- a/src/bin/efreet/efreetd.c
+++ b/src/bin/efreet/efreetd.c
@@ -44,6 +44,11 @@ main(int argc, char *argv[])
 
    if (!eina_init()) return 1;
 
+   efreetd_mp_stat = eina_mempool_add("chained_mempool",
+                                      "struct stat", NULL,
+                                     sizeof(struct stat), 10);
+   if (!efreetd_mp_stat) return 1;
+
    if (!ecore_init()) goto ecore_error;
    ecore_app_args_set(argc, (const char **)argv);
    if (!ecore_file_init()) goto ecore_file_error;
@@ -60,7 +65,7 @@ main(int argc, char *argv[])
    fd = eina_file_mkstemp(path, NULL);
    if (fd < 0)
      {
-        ERR("Can't create log file '%s'\b", path);;
+        ERR("Can't create log file '%s'\b", path);
         goto tmp_error;
      }
    log = fdopen(fd, "wb");
@@ -75,6 +80,8 @@ main(int argc, char *argv[])
 
    ecore_main_loop_begin();
 
+   eina_mempool_del(efreetd_mp_stat);
+
    cache_shutdown();
    ipc_shutdown();
    ecore_file_shutdown();
diff --git a/src/bin/efreet/efreetd_cache.c b/src/bin/efreet/efreetd_cache.c
index 7f3dc07..58fb520 100644
--- a/src/bin/efreet/efreetd_cache.c
+++ b/src/bin/efreet/efreetd_cache.c
@@ -89,7 +89,6 @@ static void
 subdir_cache_dir_free(Subdir_Cache_Dir *cd)
 {
    unsigned int i;
-
    if (!cd) return;
    if (cd->dirs)
      {
@@ -112,9 +111,10 @@ subdir_cache_hash_add(void *hash, const char *key, void 
*data)
 static void
 subdir_cache_init(void)
 {
-   char buf[PATH_MAX];
    Eet_Data_Descriptor_Class eddc;
    Eet_File *ef;
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf) return;
 
    // set up data codecs for subdirs in memory
    eet_eina_stream_data_descriptor_class_set(&eddc, sizeof(Subdir_Cache_Dir), 
"D", sizeof(Subdir_Cache_Dir));
@@ -136,14 +136,16 @@ subdir_cache_init(void)
    EET_DATA_DESCRIPTOR_ADD_HASH(subdir_edd, Subdir_Cache, "dirs", dirs, 
subdir_dir_edd);
 
    // load subdirs from the cache file
-   snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet",
-            efreet_cache_home_get(), efreet_hostname_get());
-   ef = eet_open(buf, EET_FILE_MODE_READ);
+   eina_strbuf_append_printf(buf, "%s/efreet/subdirs_%s.eet",
+                             efreet_cache_home_get(), efreet_hostname_get());
+   ef = eet_open(eina_strbuf_string_get(buf), EET_FILE_MODE_READ);
    if (ef)
      {
         subdir_cache = eet_data_read(ef, subdir_edd, "subdirs");
         eet_close(ef);
      }
+   eina_strbuf_free(buf);
+
    // if we don't have a decoded subdir cache - allocate one
    if (!subdir_cache) subdir_cache = calloc(1, sizeof(Subdir_Cache));
    if (!subdir_cache)
@@ -176,22 +178,28 @@ subdir_cache_shutdown(void)
 static void
 subdir_cache_save(void)
 {
-   char buf[PATH_MAX], buf2[PATH_MAX];
+   Eina_Strbuf *buf;
    Eet_File *ef;
    Eina_Tmpstr *tmpstr = NULL;
    int tmpfd;
 
+   buf = eina_strbuf_new();
+   if (!buf) return;
+
    // only if subdirs need saving... and we have subdirs.
    if (!subdir_need_save) return;
    if (!subdir_cache) return;
    if (!subdir_cache->dirs) return;
 
    // save to tmp file first
-   snprintf(buf2, sizeof(buf2), "%s/efreet/subdirs_%s.eet.XXXXXX.cache",
-            efreet_cache_home_get(), efreet_hostname_get());
-   tmpfd = eina_file_mkstemp(buf2, &tmpstr);
+   eina_strbuf_append_printf(buf, "%s/efreet/subdirs_%s.eet.XXXXXX.cache",
+                             efreet_cache_home_get(), efreet_hostname_get());
+
+   tmpfd = eina_file_mkstemp(eina_strbuf_string_get(buf), &tmpstr);
    if (tmpfd < 0) return;
 
+   eina_strbuf_reset(buf);
+
    // write out eet file to tmp file
    ef = eet_open(tmpstr, EET_FILE_MODE_WRITE);
    eet_data_write(ef, subdir_edd, "subdirs", subdir_cache, 
EET_COMPRESSION_SUPERFAST);
@@ -207,16 +215,18 @@ subdir_cache_save(void)
 #endif
 
    // atomically rename subdirs file on top from tmp file
-   snprintf(buf, sizeof(buf), "%s/efreet/subdirs_%s.eet",
-            efreet_cache_home_get(), efreet_hostname_get());
-   if (rename(tmpstr, buf) < 0)
+   eina_strbuf_append_printf(buf, "%s/efreet/subdirs_%s.eet",
+                             efreet_cache_home_get(), efreet_hostname_get());
+
+   if (rename(tmpstr, eina_strbuf_string_get(buf)) < 0)
      {
         unlink(tmpstr);
-        ERR("Can't save subdir cache %s", buf);
+        ERR("Can't save subdir cache %s", eina_strbuf_string_get(buf));
      }
    // we dont need saving anymore - we just did
    subdir_need_save = EINA_FALSE;
    eina_tmpstr_del(tmpstr);
+   eina_strbuf_free(buf);
 }
 
 static const Subdir_Cache_Dir *
@@ -269,6 +279,7 @@ subdir_cache_get(const struct stat *st, const char *path)
    // go through content finding directories
    it = eina_file_stat_ls(path);
    if (!it) return cd;
+   
    EINA_ITERATOR_FOREACH(it, info)
      {
         // if ., .. or other "hidden" dot files - ignore
@@ -283,6 +294,7 @@ subdir_cache_get(const struct stat *st, const char *path)
           }
      }
    eina_iterator_free(it);
+   
    // now convert our temporary list into an array of stringshare strings
    cd->dirs_count = eina_list_count(files);
    if (cd->dirs_count > 0)
@@ -304,7 +316,8 @@ subdir_cache_get(const struct stat *st, const char *path)
 static Eina_Bool
 icon_cache_update_cache_cb(void *data EINA_UNUSED)
 {
-   char file[PATH_MAX];
+   Eina_Strbuf *file = eina_strbuf_new();
+   if (!file) return EINA_FALSE;
 
    icon_cache_timer = NULL;
 
@@ -325,19 +338,18 @@ icon_cache_update_cache_cb(void *data EINA_UNUSED)
    subdir_cache_save();
 
    /* TODO: Queue if already running */
-   snprintf(file, sizeof(file),
-            "%s/efreet/" MODULE_ARCH "/efreet_icon_cache_create",
-            eina_prefix_lib_get(pfx));
+   eina_strbuf_append_printf(file, "%s/efreet/" MODULE_ARCH 
"/efreet_icon_cache_create",
+                             eina_prefix_lib_get(pfx));
    if (icon_extra_dirs)
      {
         Eina_List *ll;
         char *p;
 
-        eina_strlcat(file, " -d", sizeof(file));
+        eina_strbuf_append(file, " -d");
         EINA_LIST_FOREACH(icon_extra_dirs, ll, p)
           {
-             eina_strlcat(file, " ", sizeof(file));
-             eina_strlcat(file, p, sizeof(file));
+             eina_strbuf_append(file, " ");
+             eina_strbuf_append(file, p);
           }
      }
    if (icon_exts)
@@ -345,18 +357,22 @@ icon_cache_update_cache_cb(void *data EINA_UNUSED)
         Eina_List *ll;
         char *p;
 
-        eina_strlcat(file, " -e", sizeof(file));
+        eina_strbuf_append(file, " -e");
         EINA_LIST_FOREACH(icon_exts, ll, p)
           {
-             eina_strlcat(file, " ", sizeof(file));
-             eina_strlcat(file, p, sizeof(file));
+             eina_strbuf_append(file, " ");
+             eina_strbuf_append(file, p);
           }
      }
    if (icon_flush)
-     eina_strlcat(file, " -f", sizeof(file));
+     eina_strbuf_append(file, " -f");
    icon_flush = EINA_FALSE;
    icon_cache_exe =
-      ecore_exe_pipe_run(file, 
ECORE_EXE_PIPE_READ|ECORE_EXE_PIPE_READ_LINE_BUFFERED, NULL);
+      ecore_exe_pipe_run(eina_strbuf_string_get(file), ECORE_EXE_PIPE_READ |
+                                                       
ECORE_EXE_PIPE_READ_LINE_BUFFERED,
+                                                       NULL);
+
+   eina_strbuf_free(file);
 
    return ECORE_CALLBACK_CANCEL;
 }
@@ -364,7 +380,7 @@ icon_cache_update_cache_cb(void *data EINA_UNUSED)
 static Eina_Bool
 desktop_cache_update_cache_cb(void *data EINA_UNUSED)
 {
-   char file[PATH_MAX];
+   Eina_Strbuf *file = eina_strbuf_new();
 
    desktop_cache_timer = NULL;
 
@@ -383,24 +399,27 @@ desktop_cache_update_cache_cb(void *data EINA_UNUSED)
    desktop_changes_listen();
    subdir_cache_save();
 
-   snprintf(file, sizeof(file),
-            "%s/efreet/" MODULE_ARCH "/efreet_desktop_cache_create",
-            eina_prefix_lib_get(pfx));
+   eina_strbuf_append_printf(file, "%s/efreet/" MODULE_ARCH 
"/efreet_desktop_cache_create",
+                            eina_prefix_lib_get(pfx));
    if (desktop_extra_dirs)
      {
         Eina_List *ll;
         const char *str;
 
-        eina_strlcat(file, " -d", sizeof(file));
+        eina_strbuf_append(file, " -d");
         EINA_LIST_FOREACH(desktop_extra_dirs, ll, str)
           {
-             eina_strlcat(file, " ", sizeof(file));
-             eina_strlcat(file, str, sizeof(file));
+             eina_strbuf_append(file, " ");
+             eina_strbuf_append(file, str);
           }
      }
-   INF("Run desktop cache creation: %s", file);
+   INF("Run desktop cache creation: %s", eina_strbuf_string_get(file));
    desktop_cache_exe = ecore_exe_pipe_run
-     (file, ECORE_EXE_PIPE_READ | ECORE_EXE_PIPE_READ_LINE_BUFFERED, NULL);
+     (eina_strbuf_string_get(file), ECORE_EXE_PIPE_READ |
+                                    ECORE_EXE_PIPE_READ_LINE_BUFFERED,
+                                    NULL);
+
+   eina_strbuf_free(file);
 
    return ECORE_CALLBACK_CANCEL;
 }
@@ -536,14 +555,15 @@ _check_recurse_monitor_sanity(Eina_Inarray *stack, const 
char *path, unsigned in
 static void
 icon_changes_listen_recursive(Eina_Inarray *stack, const char *path, Eina_Bool 
base)
 {
-   struct stat st;
+   struct stat *st = eina_mempool_malloc(efreetd_mp_stat, sizeof(struct stat));
+   if (!st) return;
 
-   if (stat(path, &st) == -1) return;
-   if (eina_inarray_search(stack, &st, stat_cmp) >= 0) return;
+   if (stat(path, st) == -1) return;
+   if (eina_inarray_search(stack, st, stat_cmp) >= 0) return;
    if (!_check_recurse_monitor_sanity(stack, path, 10)) return;
-   eina_inarray_push(stack, &st);
+   eina_inarray_push(stack, st);
 
-   if ((!S_ISDIR(st.st_mode)) && (base))
+   if ((!S_ISDIR(st->st_mode)) && (base))
      {
         // XXX: if it doesn't exist... walk the parent dirs back down
         // to this path until we find one that doesn't exist, then
@@ -553,36 +573,41 @@ icon_changes_listen_recursive(Eina_Inarray *stack, const 
char *path, Eina_Bool b
         // monitoring the next specific child dir down until we are
         // monitoring the original path again.
      }
-   if (S_ISDIR(st.st_mode))
+   if (S_ISDIR(st->st_mode))
      {
         unsigned int i;
-        const Subdir_Cache_Dir *cd = subdir_cache_get(&st, path);
-        icon_changes_monitor_add(&st, path);
+        const Subdir_Cache_Dir *cd = subdir_cache_get(st, path);
+        icon_changes_monitor_add(st, path);
         if (cd)
           {
+             Eina_Strbuf *buf = eina_strbuf_new();
+             if (!buf) return;
              for (i = 0; i < cd->dirs_count; i++)
                {
-                  char buf[PATH_MAX];
 
-                  snprintf(buf, sizeof(buf), "%s/%s", path, cd->dirs[i]);
-                  icon_changes_listen_recursive(stack, buf, EINA_FALSE);
+                  eina_strbuf_append_printf(buf,  "%s/%s", path, cd->dirs[i]);
+                  icon_changes_listen_recursive(stack, 
eina_strbuf_string_get(buf), EINA_FALSE);
+                  eina_strbuf_reset(buf);
                }
+             eina_strbuf_free(buf);
           }
      }
    eina_inarray_pop(stack);
+   eina_mempool_free(efreetd_mp_stat, st);
 }
 
 static void
 desktop_changes_listen_recursive(Eina_Inarray *stack, const char *path, 
Eina_Bool base)
 {
-   struct stat st;
+   struct stat *st = eina_mempool_malloc(efreetd_mp_stat, sizeof(struct stat));
+   if (!st) return;
 
-   if (stat(path, &st) == -1) return;
-   if (eina_inarray_search(stack, &st, stat_cmp) >= 0) return;
+   if (stat(path, st) == -1) return;
+   if (eina_inarray_search(stack, st, stat_cmp) >= 0) return;
    if (!_check_recurse_monitor_sanity(stack, path, 10)) return;
-   eina_inarray_push(stack, &st);
+   eina_inarray_push(stack, st);
 
-   if ((!S_ISDIR(st.st_mode)) && (base))
+   if ((!S_ISDIR(st->st_mode)) && (base))
      {
         // XXX: if it doesn't exist... walk the parent dirs back down
         // to this path until we find one that doesn't exist, then
@@ -592,23 +617,26 @@ desktop_changes_listen_recursive(Eina_Inarray *stack, 
const char *path, Eina_Boo
         // monitoring the next specific child dir down until we are
         // monitoring the original path again.
      }
-   if (S_ISDIR(st.st_mode))
+   if (S_ISDIR(st->st_mode))
      {
         unsigned int i;
-        const Subdir_Cache_Dir *cd = subdir_cache_get(&st, path);
-        desktop_changes_monitor_add(&st, path);
+        const Subdir_Cache_Dir *cd = subdir_cache_get(st, path);
+        desktop_changes_monitor_add(st, path);
         if (cd)
           {
+             Eina_Strbuf *buf = eina_strbuf_new();
+             if (!buf) return;
              for (i = 0; i < cd->dirs_count; i++)
                {
-                  char buf[PATH_MAX];
-
-                  snprintf(buf, sizeof(buf), "%s/%s", path, cd->dirs[i]);
-                  desktop_changes_listen_recursive(stack, buf, EINA_FALSE);
+                  eina_strbuf_append_printf(buf, "%s/%s", path, cd->dirs[i]);
+                  desktop_changes_listen_recursive(stack, 
eina_strbuf_string_get(buf), EINA_FALSE);
+                  eina_strbuf_reset(buf);
                }
+             eina_strbuf_free(buf);
           }
      }
    eina_inarray_pop(stack);
+   eina_mempool_free(efreetd_mp_stat, st);
 }
 
 static void
@@ -616,9 +644,10 @@ icon_changes_listen(void)
 {
    Eina_List *l;
    Eina_List *xdg_dirs;
-   char buf[PATH_MAX];
    const char *dir;
    Eina_Inarray *stack;
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf) return;
 
    stack = eina_inarray_new(sizeof(struct stat), 16);
    if (!stack) return;
@@ -635,22 +664,25 @@ icon_changes_listen(void)
    xdg_dirs = efreet_data_dirs_get();
    EINA_LIST_FOREACH(xdg_dirs, l, dir)
      {
-        snprintf(buf, sizeof(buf), "%s/icons", dir);
+        eina_strbuf_append_printf(buf, "%s/icons", dir);
         eina_inarray_flush(stack);
-        icon_changes_listen_recursive(stack, buf, EINA_TRUE);
+        icon_changes_listen_recursive(stack, eina_strbuf_string_get(buf), 
EINA_TRUE);
+        eina_strbuf_reset(buf);
      }
 
 #ifndef STRICT_SPEC
    EINA_LIST_FOREACH(xdg_dirs, l, dir)
      {
-        snprintf(buf, sizeof(buf), "%s/pixmaps", dir);
+        eina_strbuf_append_printf(buf, "%s/pixmaps", dir);
         eina_inarray_flush(stack);
-        icon_changes_listen_recursive(stack, buf, EINA_TRUE);
+        icon_changes_listen_recursive(stack, eina_strbuf_string_get(buf), 
EINA_TRUE);
+        eina_strbuf_reset(buf);
      }
 #endif
    eina_inarray_flush(stack);
    icon_changes_listen_recursive(stack, "/usr/share/pixmaps", EINA_TRUE);
    eina_inarray_free(stack);
+   eina_strbuf_free(buf);
 }
 
 static void
@@ -681,10 +713,11 @@ fill_list(const char *file, Eina_List **l)
    Eina_File *f = NULL;
    Eina_Iterator *it = NULL;
    Eina_File_Line *line = NULL;
-   char buf[PATH_MAX];
-
-   snprintf(buf, sizeof(buf), "%s/efreet/%s", efreet_cache_home_get(), file);
-   f = eina_file_open(buf, EINA_FALSE);
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf) return;
+   
+   eina_strbuf_append_printf(buf, "%s/efreet/%s", efreet_cache_home_get(), 
file);
+   f = eina_file_open(eina_strbuf_string_get(buf), EINA_FALSE);
    if (!f) return;
    it = eina_file_map_lines(f);
    if (!it) goto error;
@@ -698,6 +731,7 @@ fill_list(const char *file, Eina_List **l)
      }
    eina_iterator_free(it);
 error:
+   eina_strbuf_free(buf);
    eina_file_close(f);
 }
 
@@ -715,16 +749,18 @@ static void
 save_list(const char *file, Eina_List *l)
 {
    FILE *f;
-   char buf[PATH_MAX];
    Eina_List *ll;
    const char *path;
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf) return;
 
-   snprintf(buf, sizeof(buf), "%s/efreet/%s", efreet_cache_home_get(), file);
-   f = fopen(buf, "wb");
+   eina_strbuf_append_printf(buf, "%s/efreet/%s", efreet_cache_home_get(), 
file);
+   f = fopen(eina_strbuf_string_get(buf), "wb");
    if (!f) return;
    EINA_LIST_FOREACH(l, ll, path)
       fprintf(f, "%s\n", path);
    fclose(f);
+   eina_strbuf_free(buf);
 }
 
 static int
@@ -849,15 +885,17 @@ cache_desktop_exists(void)
 static void
 mime_update_launch(void)
 {
-   char file[PATH_MAX];
+   Eina_Strbuf *file = eina_strbuf_new();
+   if (!file) return;
 
-   snprintf(file, sizeof(file),
+   eina_strbuf_append_printf(file,
             "%s/efreet/" MODULE_ARCH "/efreet_mime_cache_create",
             eina_prefix_lib_get(pfx));
-   mime_cache_exe = ecore_exe_pipe_run(file,
+   mime_cache_exe = ecore_exe_pipe_run(eina_strbuf_string_get(file),
                                        ECORE_EXE_PIPE_READ |
                                        ECORE_EXE_PIPE_READ_LINE_BUFFERED,
                                        NULL);
+   eina_strbuf_free(file);
 }
 
 static Eina_Bool
@@ -879,7 +917,8 @@ mime_cache_init(void)
    Eio_Monitor *mon;
    Eina_List *datadirs, *l;
    const char *s;
-   char buf[PATH_MAX];
+   Eina_Strbuf *buf = eina_strbuf_new();
+   if (!buf) return;
 
    mime_monitors = eina_hash_string_superfast_new
      (EINA_FREE_CB(eio_monitor_del));
@@ -907,20 +946,21 @@ mime_cache_init(void)
    datadirs = efreet_data_dirs_get();
    EINA_LIST_FOREACH(datadirs, l, s)
      {
-        snprintf(buf, sizeof(buf), "%s/mime", s); // specifically lok at 
XXX/mime/globs
-        if (ecore_file_is_dir(buf))
+        eina_strbuf_append_printf(buf, "%s/mime", s); // specifically lok at 
XXX/mime/globs
+        if (ecore_file_is_dir(eina_strbuf_string_get(buf)))
           {
-             if (!eina_hash_find(mime_monitors, buf))
+             if (!eina_hash_find(mime_monitors, eina_strbuf_string_get(buf)))
                {
-                  mon = eio_monitor_add(buf);
+                  mon = eio_monitor_add(eina_strbuf_string_get(buf));
                   if (mon)
                     {
-                       eina_hash_add(mime_monitors, buf, mon);
+                       eina_hash_add(mime_monitors, 
eina_strbuf_string_get(buf), mon);
                        eina_hash_add(mime_monitors_mon, &mon, mon);
                     }
                }
           }
      }
+   eina_strbuf_free(buf);
 }
 
 static void
diff --git a/src/bin/efreet/efreetd_cache.h b/src/bin/efreet/efreetd_cache.h
index 2fb520e..72a6f2b 100644
--- a/src/bin/efreet/efreetd_cache.h
+++ b/src/bin/efreet/efreetd_cache.h
@@ -1,6 +1,8 @@
 #ifndef __EFREETD_CACHE_H
 #define __EFREETD_CACHE_H
 
+Eina_Mempool *efreetd_mp_stat;
+
 void cache_desktop_dir_add(const char *dir);
 void cache_icon_dir_add(const char *dir);
 void cache_icon_ext_add(const char *ext);
diff --git a/src/lib/eio/eio_monitor_kevent.c b/src/lib/eio/eio_monitor_kevent.c
index e4a6e06..7a54f1d 100644
--- a/src/lib/eio/eio_monitor_kevent.c
+++ b/src/lib/eio/eio_monitor_kevent.c
@@ -100,6 +100,8 @@ _eio_kevent_ls(const char *directory)
         files = eina_list_append(files, file);
      }
 
+   eina_iterator_free(it);
+
    return files;
 }
 

-- 


Reply via email to