eet: remove use of prev to reduce memory usage (30KB on 32bits system).

This commit is contained in:
Cedric BAIL 2013-04-05 12:14:50 +09:00
parent f001cfac38
commit 5465eb3acc
3 changed files with 22 additions and 14 deletions

View File

@ -32,7 +32,6 @@ struct _Eet_String
int len;
int next;
int prev;
};
struct _Eet_Dictionary
{

View File

@ -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;
}

View File

@ -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 */