raster pushed a commit to branch master. http://git.enlightenment.org/core/efl.git/commit/?id=7d36abad25e102b2e09e49ff5000906673b046f5
commit 7d36abad25e102b2e09e49ff5000906673b046f5 Author: Carsten Haitzler (Rasterman) <ras...@rasterman.com> Date: Mon Apr 20 21:46:23 2015 +0900 eio - fix crashes due to stale eio files in tracking list so eio_eet didnt free fiels the same as the rest of eio. it thought it was special. it thought it could just go free() it's objects (even though they inherit the core Eio_File object type in their structs). everyone else ended up calling eio_file_free() EXCEPT eio_eet. so the eio_(long)_file_set() funcs ewnded up adding this eio file to the tracking list via eio_file_register() but never unregistered because they really liked to just do their own thing anyway... BAD CEDRIC! SPANKING TIME http://33.media.tumblr.com/3422c76c33c3b9b045f623ff73e0bf8d/tumblr_mhvu61N9br1rbavngo1_500.gi so this unifies all allocation to now use a single allocator (that also ensures all eio async io objects are zero'd out), and a SINGLE free path, and then it all works. no more valgrind complaints on e shutdown/restart whilst eio "things" were used before or ... maybe still around. this should fix T2129 so try again "git master" after this commit. @fix --- src/lib/eio/eio_eet.c | 26 +++++++++++++------------- src/lib/eio/eio_file.c | 10 +++++----- src/lib/eio/eio_main.c | 12 ++++++++++++ src/lib/eio/eio_private.h | 3 +++ src/lib/eio/eio_single.c | 14 +++++++------- 5 files changed, 40 insertions(+), 25 deletions(-) diff --git a/src/lib/eio/eio_eet.c b/src/lib/eio/eio_eet.c index d14c3f3..29b3d74 100644 --- a/src/lib/eio/eio_eet.c +++ b/src/lib/eio/eio_eet.c @@ -43,7 +43,7 @@ static void _eio_eet_open_free(Eio_Eet_Open *eet) { if (eet->filename) eina_stringshare_del(eet->filename); - free(eet); + eio_file_free((Eio_File *)eet); } static void @@ -88,7 +88,7 @@ _eio_eet_simple_end(void *data, Ecore_Thread *thread EINA_UNUSED) Eio_Eet_Simple *eet = data; eet->common.done_cb((void*) eet->common.data, &eet->common); - free(eet); + eio_file_free((Eio_File *)eet); } static void @@ -97,7 +97,7 @@ _eio_eet_simple_cancel(void *data, Ecore_Thread *thread EINA_UNUSED) Eio_Eet_Simple *eet = data; eet->error_cb((void*) eet->common.data, &eet->common, eet->error); - free(eet); + eio_file_free((Eio_File *)eet); } static void @@ -117,7 +117,7 @@ _eio_eet_write_cipher_free(Eio_Eet_Write *ew) { eina_stringshare_del(ew->name); eina_stringshare_del(ew->cipher_key); - free(ew); + eio_file_free((Eio_File *)ew); } static void @@ -320,7 +320,7 @@ eio_eet_open(const char *filename, EINA_SAFETY_ON_NULL_RETURN_VAL(eet_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - eet = malloc(sizeof (Eio_Eet_Open)); + eet = eio_common_alloc(sizeof(Eio_Eet_Open)); EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL); eet->eet_cb = eet_cb; @@ -351,7 +351,7 @@ eio_eet_close(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - eet = malloc(sizeof (Eio_Eet_Simple)); + eet = eio_common_alloc(sizeof(Eio_Eet_Simple)); EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL); eet->ef = ef; @@ -381,7 +381,7 @@ eio_eet_flush(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - eet = malloc(sizeof (Eio_Eet_Simple)); + eet = eio_common_alloc(sizeof(Eio_Eet_Simple)); EINA_SAFETY_ON_NULL_RETURN_VAL(eet, NULL); eet->ef = ef; @@ -427,7 +427,7 @@ eio_eet_data_write_cipher(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - ew = malloc(sizeof (Eio_Eet_Write)); + ew = eio_common_alloc(sizeof(Eio_Eet_Write)); EINA_SAFETY_ON_NULL_RETURN_VAL(ew, NULL); ew->ef = ef; @@ -467,7 +467,7 @@ eio_eet_data_read_cipher(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - er = malloc(sizeof (Eio_Eet_Read)); + er = eio_common_alloc(sizeof(Eio_Eet_Read)); EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL); er->ef = ef; @@ -510,7 +510,7 @@ eio_eet_data_image_write_cipher(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - eiw = malloc(sizeof (Eio_Eet_Image_Write)); + eiw = eio_common_alloc(sizeof(Eio_Eet_Image_Write)); EINA_SAFETY_ON_NULL_RETURN_VAL(eiw, NULL); eiw->ef = ef; @@ -551,7 +551,7 @@ eio_eet_read_direct(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - er = malloc(sizeof (Eio_Eet_Read)); + er = eio_common_alloc(sizeof(Eio_Eet_Read)); EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL); er->ef = ef; @@ -587,7 +587,7 @@ eio_eet_read_cipher(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - er = malloc(sizeof (Eio_Eet_Read)); + er = eio_common_alloc(sizeof(Eio_Eet_Read)); EINA_SAFETY_ON_NULL_RETURN_VAL(er, NULL); er->ef = ef; @@ -625,7 +625,7 @@ eio_eet_write_cipher(Eet_File *ef, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - ew = malloc(sizeof (Eio_Eet_Write)); + ew = eio_common_alloc(sizeof(Eio_Eet_Write)); EINA_SAFETY_ON_NULL_RETURN_VAL(ew, NULL); ew->ef = ef; diff --git a/src/lib/eio/eio_file.c b/src/lib/eio/eio_file.c index 7a104f4..e651eac 100644 --- a/src/lib/eio/eio_file.c +++ b/src/lib/eio/eio_file.c @@ -505,7 +505,7 @@ eio_file_ls(const char *dir, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - async = calloc(1, sizeof (Eio_File_Char_Ls)); + async = eio_common_alloc(sizeof(Eio_File_Char_Ls)); EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL); async->filter_cb = filter_cb; @@ -540,7 +540,7 @@ eio_file_direct_ls(const char *dir, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - async = calloc(1, sizeof(Eio_File_Direct_Ls)); + async = eio_common_alloc(sizeof(Eio_File_Direct_Ls)); EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL); async->filter_cb = filter_cb; @@ -575,7 +575,7 @@ eio_file_stat_ls(const char *dir, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - async = calloc(1, sizeof(Eio_File_Direct_Ls)); + async = eio_common_alloc(sizeof(Eio_File_Direct_Ls)); EINA_SAFETY_ON_NULL_RETURN_VAL(async, NULL); async->filter_cb = filter_cb; @@ -679,7 +679,7 @@ eio_file_copy(const char *source, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - copy = malloc(sizeof(Eio_File_Progress)); + copy = eio_common_alloc(sizeof(Eio_File_Progress)); EINA_SAFETY_ON_NULL_RETURN_VAL(copy, NULL); copy->op = EIO_FILE_COPY; @@ -715,7 +715,7 @@ eio_file_move(const char *source, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - move = malloc(sizeof(Eio_File_Move)); + move = eio_common_alloc(sizeof(Eio_File_Move)); EINA_SAFETY_ON_NULL_RETURN_VAL(move, NULL); move->progress.op = EIO_FILE_MOVE; diff --git a/src/lib/eio/eio_main.c b/src/lib/eio/eio_main.c index f084cb7..a22e515 100644 --- a/src/lib/eio/eio_main.c +++ b/src/lib/eio/eio_main.c @@ -233,6 +233,18 @@ eio_pack_send(Ecore_Thread *thread, Eina_List *pack, double *start) return pack; } +void * +eio_common_alloc(size_t size) +{ + return calloc(1, size); +} + +void +eio_common_free(Eio_File *common) +{ + free(common); +} + // For now use a list for simplicity and we should not have that many // pending request static Eina_List *tracked_thread = NULL; diff --git a/src/lib/eio/eio_private.h b/src/lib/eio/eio_private.h index b36360d..6d58f9f 100644 --- a/src/lib/eio/eio_private.h +++ b/src/lib/eio/eio_private.h @@ -498,6 +498,9 @@ void eio_async_error(void *data, Ecore_Thread *thread); Eina_List *eio_pack_send(Ecore_Thread *thread, Eina_List *pack, double *start); +void *eio_common_alloc(size_t size); +void eio_common_free(Eio_File *common); + void eio_file_register(Eio_File *common); void eio_file_unregister(Eio_File *common); diff --git a/src/lib/eio/eio_single.c b/src/lib/eio/eio_single.c index 1607cf3..f47c183 100644 --- a/src/lib/eio/eio_single.c +++ b/src/lib/eio/eio_single.c @@ -327,7 +327,7 @@ eio_file_free(Eio_File *common) if (common->main.associated) eina_hash_free(common->main.associated); eio_file_unregister(common); - free(common); + eio_common_free(common); } Eina_Bool @@ -428,7 +428,7 @@ eio_file_direct_stat(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - s = malloc(sizeof (Eio_File_Stat)); + s = eio_common_alloc(sizeof (Eio_File_Stat)); if (!s) return NULL; s->path = eina_stringshare_add(path); @@ -460,7 +460,7 @@ eio_file_direct_lstat(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - s = malloc(sizeof (Eio_File_Stat)); + s = eio_common_alloc(sizeof (Eio_File_Stat)); if (!s) return NULL; s->path = eina_stringshare_add(path); @@ -490,7 +490,7 @@ eio_file_unlink(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - l = malloc(sizeof (Eio_File_Unlink)); + l = eio_common_alloc(sizeof (Eio_File_Unlink)); if (!l) return NULL; l->path = eina_stringshare_add(path); @@ -520,7 +520,7 @@ eio_file_mkdir(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - r = malloc(sizeof (Eio_File_Mkdir)); + r = eio_common_alloc(sizeof (Eio_File_Mkdir)); if (!r) return NULL; r->path = eina_stringshare_add(path); @@ -551,7 +551,7 @@ eio_file_chmod(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - r = malloc(sizeof (Eio_File_Mkdir)); + r = eio_common_alloc(sizeof (Eio_File_Mkdir)); if (!r) return NULL; r->path = eina_stringshare_add(path); @@ -583,7 +583,7 @@ eio_file_chown(const char *path, EINA_SAFETY_ON_NULL_RETURN_VAL(done_cb, NULL); EINA_SAFETY_ON_NULL_RETURN_VAL(error_cb, NULL); - c = malloc(sizeof (Eio_File_Chown)); + c = eio_common_alloc(sizeof (Eio_File_Chown)); if (!c) return NULL; c->path = eina_stringshare_add(path); --