On Mon, 4 Jan 2010, Enlightenment SVN wrote:
> Log: > another deadlock in eet - threadsafe goop! fix fix fix! if I'm not mistaken, the ChangeLog has not been updated for that fix Vincent > > > Author: raster > Date: 2010-01-04 20:40:12 -0800 (Mon, 04 Jan 2010) > New Revision: 44906 > > Modified: > trunk/eet/src/lib/eet_lib.c > > Modified: trunk/eet/src/lib/eet_lib.c > =================================================================== > --- trunk/eet/src/lib/eet_lib.c 2010-01-05 02:15:41 UTC (rev 44905) > +++ trunk/eet/src/lib/eet_lib.c 2010-01-05 04:40:12 UTC (rev 44906) > @@ -218,6 +218,8 @@ > static Eet_File_Node *find_node_by_name(Eet_File *ef, const char *name); > static int read_data_from_disk(Eet_File *ef, Eet_File_Node *efn, > void *buf, int len); > > +static Eet_Error eet_internal_close(Eet_File *ef, Eina_Bool locked); > + > #ifdef EFL_HAVE_PTHREAD > static pthread_mutex_t eet_cache_lock = PTHREAD_MUTEX_INITIALIZER; > > @@ -278,7 +280,7 @@ > if (test) > { > ef->delete_me_now = 1; > - eet_close(ef); > + eet_internal_close(ef, 0); > } > return test; > } > @@ -331,7 +333,7 @@ > if (del_ef) > { > del_ef->delete_me_now = 1; > - eet_close(del_ef); > + eet_internal_close(ef, 1); > } > } > > @@ -1298,6 +1300,93 @@ > return NULL; > } > > +static Eet_Error > +eet_internal_close(Eet_File *ef, Eina_Bool locked) > +{ > + Eet_Error err; > + > + /* check to see its' an eet file pointer */ > + if (eet_check_pointer(ef)) > + return EET_ERROR_BAD_OBJECT; > + /* deref */ > + ef->references--; > + /* if its still referenced - dont go any further */ > + if (ef->references > 0) return EET_ERROR_NONE; > + /* flush any writes */ > + err = eet_flush2(ef); > + > + eet_identity_unref(ef->key); > + ef->key = NULL; > + > + /* if not urgent to delete it - dont free it - leave it in cache */ > + if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ)) > + return EET_ERROR_NONE; > + > + /* remove from cache */ > + if (!locked) > + { > + LOCK_CACHE; > + } > + if (ef->mode == EET_FILE_MODE_READ) > + eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); > + else if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == > EET_FILE_MODE_READ_WRITE)) > + eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); > + if (!locked) > + { > + UNLOCK_CACHE; > + } > + > + DESTROY_FILE(ef); > + > + /* free up data */ > + if (ef->header) > + { > + if (ef->header->directory) > + { > + if (ef->header->directory->nodes) > + { > + int i, num; > + > + num = (1 << ef->header->directory->size); > + for (i = 0; i < num; i++) > + { > + Eet_File_Node *efn; > + > + while ((efn = ef->header->directory->nodes[i])) > + { > + if (efn->data) > + free(efn->data); > + > + ef->header->directory->nodes[i] = efn->next; > + > + if (efn->free_name) > + free(efn->name); > + > + free(efn); > + } > + } > + free(ef->header->directory->nodes); > + } > + free(ef->header->directory); > + } > + free(ef->header); > + } > + > + eet_dictionary_free(ef->ed); > + > + if (ef->sha1) free(ef->sha1); > + if (ef->data) munmap((void*)ef->data, ef->data_size); > + if (ef->fp) fclose(ef->fp); > + if (ef->readfp) fclose(ef->readfp); > + > + /* zero out ram for struct - caution tactic against stale memory use */ > + memset(ef, 0, sizeof(Eet_File)); > + > + /* free it */ > + free(ef); > + return err; > +} > + > EAPI Eet_File * > eet_memopen_read(const void *data, size_t size) > { > @@ -1352,9 +1441,7 @@ > eet_flush2(ef); > ef->references++; > ef->delete_me_now = 1; > - UNLOCK_CACHE; > - eet_close(ef); > - LOCK_CACHE; > + eet_internal_close(ef, 1); > } > ef = eet_cache_find((char *)file, eet_readers, eet_readers_num); > } > @@ -1366,9 +1453,7 @@ > { > ef->delete_me_now = 1; > ef->references++; > - UNLOCK_CACHE; > - eet_close(ef); > - LOCK_CACHE; > + eet_internal_close(ef, 1); > } > ef = eet_cache_find((char *)file, eet_writers, eet_writers_num); > } > @@ -1417,7 +1502,7 @@ > { > ef->delete_me_now = 1; > ef->references++; > - eet_close(ef); > + eet_internal_close(ef, 0); > ef = NULL; > } > > @@ -1560,82 +1645,7 @@ > EAPI Eet_Error > eet_close(Eet_File *ef) > { > - Eet_Error err; > - > - /* check to see its' an eet file pointer */ > - if (eet_check_pointer(ef)) > - return EET_ERROR_BAD_OBJECT; > - /* deref */ > - ef->references--; > - /* if its still referenced - dont go any further */ > - if (ef->references > 0) return EET_ERROR_NONE; > - /* flush any writes */ > - err = eet_flush2(ef); > - > - eet_identity_unref(ef->key); > - ef->key = NULL; > - > - /* if not urgent to delete it - dont free it - leave it in cache */ > - if ((!ef->delete_me_now) && (ef->mode == EET_FILE_MODE_READ)) > - return EET_ERROR_NONE; > - > - /* remove from cache */ > - LOCK_CACHE; > - if (ef->mode == EET_FILE_MODE_READ) > - eet_cache_del(ef, &eet_readers, &eet_readers_num, &eet_readers_alloc); > - else if ((ef->mode == EET_FILE_MODE_WRITE) || (ef->mode == > EET_FILE_MODE_READ_WRITE)) > - eet_cache_del(ef, &eet_writers, &eet_writers_num, &eet_writers_alloc); > - UNLOCK_CACHE; > - > - DESTROY_FILE(ef); > - > - /* free up data */ > - if (ef->header) > - { > - if (ef->header->directory) > - { > - if (ef->header->directory->nodes) > - { > - int i, num; > - > - num = (1 << ef->header->directory->size); > - for (i = 0; i < num; i++) > - { > - Eet_File_Node *efn; > - > - while ((efn = ef->header->directory->nodes[i])) > - { > - if (efn->data) > - free(efn->data); > - > - ef->header->directory->nodes[i] = efn->next; > - > - if (efn->free_name) > - free(efn->name); > - > - free(efn); > - } > - } > - free(ef->header->directory->nodes); > - } > - free(ef->header->directory); > - } > - free(ef->header); > - } > - > - eet_dictionary_free(ef->ed); > - > - if (ef->sha1) free(ef->sha1); > - if (ef->data) munmap((void*)ef->data, ef->data_size); > - if (ef->fp) fclose(ef->fp); > - if (ef->readfp) fclose(ef->readfp); > - > - /* zero out ram for struct - caution tactic against stale memory use */ > - memset(ef, 0, sizeof(Eet_File)); > - > - /* free it */ > - free(ef); > - return err; > + return eet_internal_close(ef, 0); > } > > EAPI void * > > > ------------------------------------------------------------------------------ > This SF.Net email is sponsored by the Verizon Developer Community > Take advantage of Verizon's best-in-class app development support > A streamlined, 14 day to market process makes app distribution fast and easy > Join now and get one step closer to millions of Verizon customers > http://p.sf.net/sfu/verizon-dev2dev > _______________________________________________ > enlightenment-svn mailing list > enlightenment-...@lists.sourceforge.net > https://lists.sourceforge.net/lists/listinfo/enlightenment-svn > > ------------------------------------------------------------------------------ The Planet: dedicated and managed hosting, cloud storage, colocation Stay online with enterprise data centers and the best network in the business Choose flexible plans and management services without long-term contracts Personal 24x7 support from experience hosting pros just a phone call away. http://p.sf.net/sfu/theplanet-com _______________________________________________ enlightenment-devel mailing list enlightenment-devel@lists.sourceforge.net https://lists.sourceforge.net/lists/listinfo/enlightenment-devel