From 6e64a104a639097627072a8aea7575461ec68448 Mon Sep 17 00:00:00 2001 From: Cedric Bail Date: Tue, 17 Oct 2017 16:14:26 -0700 Subject: [PATCH] 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 76eb6e4a71..d56612fc75 100644 --- a/src/lib/eina/eina_file.c +++ b/src/lib/eina/eina_file.c @@ -792,13 +792,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) @@ -830,7 +830,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); @@ -838,8 +838,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), @@ -875,14 +874,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 69ae4f7ead..edebaed326 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; if (!file) return ; @@ -529,13 +529,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); @@ -564,6 +563,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. */ @@ -1055,7 +1068,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 76c9869861..dee8544a9b 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"