cedric pushed a commit to branch master.

http://git.enlightenment.org/core/efl.git/commit/?id=6da2fbc9c432e3c845cdc0a3e647eeb27d582c33

commit 6da2fbc9c432e3c845cdc0a3e647eeb27d582c33
Author: Cedric BAIL <ced...@osg.samsung.com>
Date:   Mon Nov 14 15:16:32 2016 -0800

    efreet: make mime type evaluation way faster by using mmap.
---
 src/lib/efreet/efreet_mime.c | 64 +++++++++++++++++---------------------------
 1 file changed, 24 insertions(+), 40 deletions(-)

diff --git a/src/lib/efreet/efreet_mime.c b/src/lib/efreet/efreet_mime.c
index 63e6b15..3197c97 100644
--- a/src/lib/efreet/efreet_mime.c
+++ b/src/lib/efreet/efreet_mime.c
@@ -1128,34 +1128,23 @@ efreet_mime_magic_check_priority(const char *file,
    Efreet_Mime_Magic *m = NULL;
    Efreet_Mime_Magic_Entry *e = NULL;
    Eina_List *l, *ll;
-   FILE *f = NULL;
-   unsigned int i = 0, offset = 0,level = 0, match = 0, bytes_read = 0;
+   Eina_File *f = NULL;
+   const char *mem = NULL;
+   size_t sz;
+   unsigned int i = 0, offset = 0,level = 0, match = 0;
    const char *last_mime = NULL;
    int c;
-   char v, buf[EFREET_MIME_MAGIC_BUFFER_SIZE];
-   struct stat s;
+   char v;
 
-#ifdef _WIN32
-   if (stat(file, &s) || s.st_size == 0)
-#else
-   if (lstat(file, &s) || s.st_size == 0)
-#endif
-      return NULL;
+   if (!magics) return NULL;
 
-   f = fopen(file, "rb");
+   f = eina_file_open(file, EINA_FALSE);
    if (!f) return NULL;
 
-   if (!magics)
-     {
-        fclose(f);
-        return NULL;
-     }
+   mem = eina_file_map_all(f, EINA_FILE_RANDOM);
+   if (!mem) goto end;
 
-   if ((bytes_read = fread(buf, 1, sizeof(buf), f)) == 0)
-     {
-        fclose(f);
-        return NULL;
-     }
+   sz = eina_file_size_get(f);
 
    EINA_LIST_FOREACH(magics, l, m)
      {
@@ -1171,30 +1160,25 @@ efreet_mime_magic_check_priority(const char *file,
                continue;
 
              if ((level >= e->indent) && !match)
-               level = e->indent;
-
+               {
+                  level = e->indent;
+               }
              else if ((level > e->indent) && match)
                {
-                  fclose(f);
-                  return last_mime;
+                  goto end;
                }
 
              for (offset = e->offset; offset < e->offset + e->range_len; 
offset++)
                {
-                  if (((offset + e->value_len) > bytes_read) &&
-                      (fseek(f, offset, SEEK_SET) == -1))
-                    break;
+                  if (offset + e->value_len >= sz) break;
 
                   match = 1;
                   for (i = 0; i < e->value_len; ++i)
                     {
-                       if (offset + e->value_len > bytes_read)
-                         c = fgetc(f);
-                       else
-                         c = buf[offset + i];
+                       c = mem[offset + i];
 
                        v = e->value[i];
-                       if (e->mask) v &= e->mask[i];
+                       if (e->mask) c &= e->mask[i];
 
                        if (!(c == v))
                          {
@@ -1212,15 +1196,15 @@ efreet_mime_magic_check_priority(const char *file,
                }
           }
 
-        if (match)
-          {
-             fclose(f);
-             return last_mime;
-          }
+        if (match) break;
      }
-   fclose(f);
 
-   return NULL;
+ end:
+   if (mem) eina_file_map_free(f, (void*) mem);
+
+   eina_file_close(f);
+
+   return last_mime;
 }
 
 /**

-- 


Reply via email to