diff options
author | Mike Blumenkrantz <zmike@osg.samsung.com> | 2018-04-25 11:59:12 -0400 |
---|---|---|
committer | Mike Blumenkrantz <zmike@osg.samsung.com> | 2018-04-25 12:00:11 -0400 |
commit | a1f649fa9dc1513e90f46eb8f81b6375caebc0c0 (patch) | |
tree | 1440662928846f3ad217a9aaef92e0b7fc63b848 /src/lib/eet | |
parent | e917be883149fa74d123bccd3ab2ae30307a0dc1 (diff) | |
download | efl-a1f649fa9dc1513e90f46eb8f81b6375caebc0c0.tar.gz |
eet: add counter for number of frees needed in each directory
Summary:
further optimize the eet_shutdown case of closing files and avoid
endlessly looping over empty nodes
Depends on D5950
Reviewers: cedric
Reviewed By: cedric
Differential Revision: https://phab.enlightenment.org/D5951
Diffstat (limited to 'src/lib/eet')
-rw-r--r-- | src/lib/eet/Eet_private.h | 1 | ||||
-rw-r--r-- | src/lib/eet/eet_lib.c | 35 |
2 files changed, 29 insertions, 7 deletions
diff --git a/src/lib/eet/Eet_private.h b/src/lib/eet/Eet_private.h index c2e6702cac..ca552277c1 100644 --- a/src/lib/eet/Eet_private.h +++ b/src/lib/eet/Eet_private.h @@ -110,6 +110,7 @@ struct _Eet_File_Directory { int size; Eet_File_Node **nodes; + unsigned int free_count; }; struct _Eet_File_Node diff --git a/src/lib/eet/eet_lib.c b/src/lib/eet/eet_lib.c index 7428ffcac5..e53d1ed89a 100644 --- a/src/lib/eet/eet_lib.c +++ b/src/lib/eet/eet_lib.c @@ -885,7 +885,10 @@ eet_internal_read2(Eet_File *ef) { efn->data = malloc(efn->size); if (efn->data) - memcpy(efn->data, ef->data + efn->offset, efn->size); + { + memcpy(efn->data, ef->data + efn->offset, efn->size); + ef->header->directory->free_count++; + } } /* compute the possible position of a signature */ @@ -1189,6 +1192,7 @@ eet_internal_read1(Eet_File *ef) strncpy(efn->name, (char *)p + HEADER_SIZE, name_size); efn->name[name_size] = 0; + ef->header->directory->free_count++; WRN( "File: %s is not up to date for key \"%s\" - needs rebuilding sometime", @@ -1211,7 +1215,10 @@ eet_internal_read1(Eet_File *ef) { data = malloc(efn->size); if (data) - memcpy(data, ef->data + efn->offset, efn->size); + { + memcpy(data, ef->data + efn->offset, efn->size); + ef->header->directory->free_count++; + } efn->data = data; } @@ -1320,21 +1327,31 @@ eet_internal_close(Eet_File *ef, int i, num; num = (1 << ef->header->directory->size); - for (i = 0; i < num; i++) + for (i = 0; i < num && ef->header->directory->free_count; i++) { Eet_File_Node *efn; while ((efn = ef->header->directory->nodes[i])) { if (efn->data) - free(efn->data); + { + free(efn->data); + ef->header->directory->free_count--; + } ef->header->directory->nodes[i] = efn->next; if (efn->free_name) - free(efn->name); - - if (!shutdown) + { + free(efn->name); + ef->header->directory->free_count--; + } + + if (shutdown) + { + if (!ef->header->directory->free_count) break; + } + else eet_file_node_mp_free(efn); } } @@ -2310,12 +2327,14 @@ eet_alias(Eet_File *ef, efn->name = strdup(name); efn->name_size = strlen(efn->name) + 1; efn->free_name = 1; + ef->header->directory->free_count++; efn->data = NULL; efn->next = ef->header->directory->nodes[hash]; ef->header->directory->nodes[hash] = efn; eet_define_data(ef, efn, in, strlen(destination) + 1, comp, 0); + ef->header->directory->free_count++; } efn->alias = 1; @@ -2458,12 +2477,14 @@ eet_write_cipher(Eet_File *ef, efn->name = strdup(name); efn->name_size = strlen(efn->name) + 1; efn->free_name = 1; + ef->header->directory->free_count++; efn->data = NULL; efn->next = ef->header->directory->nodes[hash]; ef->header->directory->nodes[hash] = efn; eet_define_data(ef, efn, in, size, comp, !!cipher_key); + ef->header->directory->free_count++; } /* flags that writes are pending */ |