stefan pushed a commit to branch efl-1.20.

http://git.enlightenment.org/core/efl.git/commit/?id=34cd172231e41e0d644c49f5caded33ba0427d30

commit 34cd172231e41e0d644c49f5caded33ba0427d30
Author: Cedric Bail <ced...@osg.samsung.com>
Date:   Tue Oct 17 16:14:26 2017 -0700

    eina: use a stringshare to store the filename internally.
    
    T6164
---
 src/lib/eina/eina_file.c        | 13 +++++--------
 src/lib/eina/eina_file_common.c | 25 +++++++++++++++++++------
 src/lib/eina/eina_file_win32.c  | 27 ++++++++++++---------------
 src/lib/eina/eina_private.h     |  3 +++
 4 files changed, 39 insertions(+), 29 deletions(-)

diff --git a/src/lib/eina/eina_file.c b/src/lib/eina/eina_file.c
index 608efb0f18..6fe6dda7d5 100644
--- a/src/lib/eina/eina_file.c
+++ b/src/lib/eina/eina_file.c
@@ -761,13 +761,13 @@ eina_file_open(const char *path, Eina_Bool shared)
 {
    Eina_File *file;
    Eina_File *n;
-   char *filename;
+   Eina_Stringshare *filename;
    struct stat file_stat;
    int fd = -1;
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
 
-   filename = eina_file_path_sanitize(path);
+   filename = eina_file_sanitize(path);
    if (!filename) return NULL;
 
    if (shared)
@@ -799,7 +799,7 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    if (!file)
      {
-        n = malloc(sizeof(Eina_File) + strlen(filename) + 1);
+        n = malloc(sizeof(Eina_File));
         if (!n)
          {
              eina_lock_release(&_eina_file_lock_cache);
@@ -807,8 +807,7 @@ eina_file_open(const char *path, Eina_Bool shared)
          }
 
         memset(n, 0, sizeof(Eina_File));
-        n->filename = (char*) (n + 1);
-        strcpy((char*) n->filename, filename);
+        n->filename = filename;
         n->map = eina_hash_new(EINA_KEY_LENGTH(eina_file_map_key_length),
                                EINA_KEY_CMP(eina_file_map_key_cmp),
                                EINA_KEY_HASH(eina_file_map_key_hash),
@@ -844,14 +843,12 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    eina_lock_release(&_eina_file_lock_cache);
 
-   free(filename);
-
    return n;
 
  on_error:
    WRN("Could not open file [%s].", filename);
+   eina_stringshare_del(filename);
 
-   free(filename);
    if (fd >= 0) close(fd);
    return NULL;
 }
diff --git a/src/lib/eina/eina_file_common.c b/src/lib/eina/eina_file_common.c
index 27e92bac5b..66547c39aa 100644
--- a/src/lib/eina/eina_file_common.c
+++ b/src/lib/eina/eina_file_common.c
@@ -502,6 +502,7 @@ eina_file_clean_close(Eina_File *file)
    // Generic destruction of the file
    eina_hash_free(file->rmap); file->rmap = NULL;
    eina_hash_free(file->map); file->map = NULL;
+   eina_stringshare_del(file->filename);
 
    // Backend specific file resource close
    eina_file_real_close(file);
@@ -515,7 +516,6 @@ EAPI void
 eina_file_close(Eina_File *file)
 {
    Eina_Bool leave = EINA_TRUE;
-   unsigned int length;
    unsigned int key;
 
    EINA_FILE_MAGIC_CHECK(file);
@@ -528,13 +528,12 @@ eina_file_close(Eina_File *file)
    eina_lock_release(&file->lock);
    if (leave) goto end;
 
-   length = strlen(file->filename) + 1;
-   key = eina_hash_djb2(file->filename, length);
+   key = eina_hash_superfast((void*) &file->filename, sizeof (void*));
    if (eina_hash_find_by_hash(_eina_file_cache,
-                              file->filename, length, key) == file)
+                              file->filename, 0, key) == file)
      {
         eina_hash_del_by_key_hash(_eina_file_cache,
-                                  file->filename, length, key);
+                                  file->filename, 0, key);
      }
 
    eina_file_clean_close(file);
@@ -563,6 +562,20 @@ eina_file_filename_get(const Eina_File *file)
    return file->filename;
 }
 
+Eina_Stringshare *
+eina_file_sanitize(const char *path)
+{
+   char *filename;
+   Eina_Stringshare *ss;
+
+   filename = eina_file_path_sanitize(path);
+   if (!filename) return NULL;
+
+   ss = eina_stringshare_add(filename);
+   free(filename);
+   return ss;
+}
+
 /* search '\r' and '\n' by preserving cache locality and page locality
    in doing a search inside 4K boundary.
  */
@@ -1054,7 +1067,7 @@ eina_file_init(void)
         return EINA_FALSE;
      }
 
-   _eina_file_cache = eina_hash_string_djb2_new(NULL);
+   _eina_file_cache = eina_hash_stringshared_new(NULL);
    if (!_eina_file_cache)
      {
         ERR("Could not create cache.");
diff --git a/src/lib/eina/eina_file_win32.c b/src/lib/eina/eina_file_win32.c
index 3a5831ea10..425cedd881 100644
--- a/src/lib/eina/eina_file_win32.c
+++ b/src/lib/eina/eina_file_win32.c
@@ -711,7 +711,7 @@ eina_file_open(const char *path, Eina_Bool shared)
 {
    Eina_File *file;
    Eina_File *n;
-   char *filename;
+   Eina_Stringshare *filename;
    HANDLE handle;
    WIN32_FILE_ATTRIBUTE_DATA fad;
    ULARGE_INTEGER length;
@@ -719,7 +719,7 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    EINA_SAFETY_ON_NULL_RETURN_VAL(path, NULL);
 
-   filename = eina_file_path_sanitize(path);
+   filename = eina_file_sanitize(path);
    if (!filename) return NULL;
 
    /* FIXME: how to emulate shm_open ? Just OpenFileMapping ? */
@@ -770,7 +770,7 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    if (!file)
      {
-        n = malloc(sizeof(Eina_File) + strlen(filename) + 1);
+        n = malloc(sizeof(Eina_File));
         if (!n)
           {
              eina_lock_release(&_eina_file_lock_cache);
@@ -778,8 +778,7 @@ eina_file_open(const char *path, Eina_Bool shared)
           }
 
         memset(n, 0, sizeof(Eina_File));
-        n->filename = (char*) (n + 1);
-        strcpy((char*) n->filename, filename);
+        n->filename = filename;
         n->map = eina_hash_new(EINA_KEY_LENGTH(eina_file_map_key_length),
                                EINA_KEY_CMP(eina_file_map_key_cmp),
                                EINA_KEY_HASH(eina_file_map_key_hash),
@@ -808,15 +807,13 @@ eina_file_open(const char *path, Eina_Bool shared)
 
    eina_lock_release(&_eina_file_lock_cache);
 
-   free(filename);
-
    return n;
 
  close_handle:
    CloseHandle(handle);
  free_file:
    ERR("Could not open file [%s].", filename);
-   free(filename);
+   eina_stringshare_del(filename);
 
    return NULL;
 }
@@ -824,8 +821,9 @@ eina_file_open(const char *path, Eina_Bool shared)
 EAPI Eina_Bool
 eina_file_unlink(const char *pathname)
 {
-   char *unlink_path = eina_file_path_sanitize(pathname);
+   Eina_Stringshare *unlink_path = eina_file_sanitize(pathname);
    Eina_File *file = eina_hash_find(_eina_file_cache, unlink_path);
+   Eina_Bool r = EINA_FALSE;
 
    if (file)
      {
@@ -845,17 +843,16 @@ eina_file_unlink(const char *pathname)
               {
                  CloseHandle(file->handle);
                  file->handle = INVALID_HANDLE_VALUE;
-                 return EINA_TRUE;
+                 r = EINA_TRUE;
+                 goto finish;
               }
           }
      }
 
-   if ( unlink(unlink_path) < 0)
-     {
-        return EINA_FALSE;
-     }
+   if ( unlink(unlink_path) >= 0) r = EINA_TRUE;
+   eina_stringshare_del(unlink_path);
 
-   return EINA_TRUE;
+   return r;
 }
 
 
diff --git a/src/lib/eina/eina_private.h b/src/lib/eina/eina_private.h
index 745364a2e5..e2d79b5277 100644
--- a/src/lib/eina/eina_private.h
+++ b/src/lib/eina/eina_private.h
@@ -24,6 +24,7 @@
 #include "eina_magic.h"
 #include "eina_iterator.h"
 #include "eina_accessor.h"
+#include "eina_stringshare.h"
 
 #ifndef ABS
 # define ABS(x) ((x) < 0 ? -(x) : (x))
@@ -142,6 +143,8 @@ Eina_Bool eina_file_mmap_faulty(void *addr, long page_size);
 typedef struct _Eina_FreeQ Eina_FreeQ;
 #endif
 
+Eina_Stringshare *eina_file_sanitize(const char *path);
+
 void eina_freeq_main_set(Eina_FreeQ *fq);
 
 #include "eina_inline_private.h"

-- 


Reply via email to