summaryrefslogtreecommitdiff
path: root/src/lib/eet
diff options
context:
space:
mode:
authorMike Blumenkrantz <zmike@osg.samsung.com>2018-04-25 11:59:12 -0400
committerMike Blumenkrantz <zmike@osg.samsung.com>2018-04-25 12:00:11 -0400
commita1f649fa9dc1513e90f46eb8f81b6375caebc0c0 (patch)
tree1440662928846f3ad217a9aaef92e0b7fc63b848 /src/lib/eet
parente917be883149fa74d123bccd3ab2ae30307a0dc1 (diff)
downloadefl-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.h1
-rw-r--r--src/lib/eet/eet_lib.c35
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 */