cedric pushed a commit to branch master.
commit 5465eb3accf8661675ff4c9111328077276fee98
Author: Cedric BAIL <[email protected]>
Date: Fri Apr 5 12:14:50 2013 +0900
eet: remove use of prev to reduce memory usage (30KB on 32bits system).
---
src/lib/eet/Eet_private.h | 1 -
src/lib/eet/eet_dictionary.c | 23 +++++++++++++----------
src/lib/eet/eet_lib.c | 12 +++++++++---
3 files changed, 22 insertions(+), 14 deletions(-)
diff --git a/src/lib/eet/Eet_private.h b/src/lib/eet/Eet_private.h
index 87d66c4..af4f75e 100644
--- a/src/lib/eet/Eet_private.h
+++ b/src/lib/eet/Eet_private.h
@@ -32,7 +32,6 @@ struct _Eet_String
int len;
int next;
- int prev;
};
struct _Eet_Dictionary
{
diff --git a/src/lib/eet/eet_dictionary.c b/src/lib/eet/eet_dictionary.c
index bdf141a..b003616 100644
--- a/src/lib/eet/eet_dictionary.c
+++ b/src/lib/eet/eet_dictionary.c
@@ -52,7 +52,8 @@ static int
_eet_dictionary_lookup(Eet_Dictionary *ed,
const char *string,
int len,
- int hash)
+ int hash,
+ int *previous)
{
Eina_Bool found = EINA_FALSE;
int prev = -1;
@@ -78,8 +79,14 @@ _eet_dictionary_lookup(Eet_Dictionary *ed,
}
if ((current == -1) && found)
- return prev;
+ {
+ // WTF ?!? How can current == -1 and found == EINA_TRUE
+ // If you happen to trigger this abort, contact enlightenment
developer mailing list
+ abort();
+ return prev;
+ }
+ if (previous) *previous = prev;
return current;
}
@@ -91,6 +98,7 @@ eet_dictionary_string_add(Eet_Dictionary *ed,
const char *str;
int hash;
int idx;
+ int pidx;
int len;
int cnt;
@@ -102,7 +110,7 @@ eet_dictionary_string_add(Eet_Dictionary *ed,
eina_lock_take(&ed->mutex);
- idx = _eet_dictionary_lookup(ed, string, len, hash);
+ idx = _eet_dictionary_lookup(ed, string, len, hash, &pidx);
if (idx != -1)
{
@@ -153,19 +161,14 @@ eet_dictionary_string_add(Eet_Dictionary *ed,
if (idx == -1)
{
current->next = ed->hash[hash];
- current->prev = -1;
ed->hash[hash] = ed->count;
}
else
{
current->next = idx;
- current->prev = ed->all[idx].prev;
-
- if (current->next != -1)
- ed->all[current->next].prev = ed->count;
- if (current->prev != -1)
- ed->all[current->prev].next = ed->count;
+ if (pidx != -1)
+ ed->all[pidx].next = ed->count;
else
ed->hash[hash] = ed->count;
}
diff --git a/src/lib/eet/eet_lib.c b/src/lib/eet/eet_lib.c
index fd835af..4716f6a 100644
--- a/src/lib/eet/eet_lib.c
+++ b/src/lib/eet/eet_lib.c
@@ -445,11 +445,16 @@ eet_flush2(Eet_File *ef)
for (j = 0; j < ef->ed->count; ++j)
{
int sbuf[EET_FILE2_DICTIONARY_ENTRY_COUNT];
+ int prev = 0;
+
+ // We still use the prev as an hint for knowing if it is the head
of the hash
+ if (ef->ed->hash[ef->ed->all_hash[j]] == j)
+ prev = -1;
sbuf[0] = (int)htonl((unsigned int)ef->ed->all_hash[j]);
sbuf[1] = (int)htonl((unsigned int)offset);
sbuf[2] = (int)htonl((unsigned int)ef->ed->all[j].len);
- sbuf[3] = (int)htonl((unsigned int)ef->ed->all[j].prev);
+ sbuf[3] = (int)htonl((unsigned int)prev);
sbuf[4] = (int)htonl((unsigned int)ef->ed->all[j].next);
offset += ef->ed->all[j].len;
@@ -959,12 +964,13 @@ eet_internal_read2(Eet_File *ef)
for (j = 0; j < ef->ed->count; ++j)
{
unsigned int offset;
+ int prev;
int hash;
GET_INT(hash, dico, idx);
GET_INT(offset, dico, idx);
GET_INT(ef->ed->all[j].len, dico, idx);
- GET_INT(ef->ed->all[j].prev, dico, idx);
+ GET_INT(prev, dico, idx); // Let's ignore prev link for
dictionary, use it only as an hint to head
GET_INT(ef->ed->all[j].next, dico, idx);
/* Hash value could be stored on 8bits data, but this will break
alignment of all the others data.
@@ -992,7 +998,7 @@ eet_internal_read2(Eet_File *ef)
return NULL;
ef->ed->all_hash[j] = hash;
- if (ef->ed->all[j].prev == -1)
+ if (prev == -1)
ef->ed->hash[hash] = j;
/* compute the possible position of a signature */
--
------------------------------------------------------------------------------
Minimize network downtime and maximize team effectiveness.
Reduce network management and security costs.Learn how to hire
the most talented Cisco Certified professionals. Visit the
Employer Resources Portal
http://www.cisco.com/web/learning/employer_resources/index.html