aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-08-28 12:56:18 +0900
committerCarsten Haitzler (Rasterman) <raster@rasterman.com>2015-08-28 12:56:18 +0900
commit0a7726252427029ee8506d33ce2d4447bd5e17c4 (patch)
tree8e71eb8a40e31bdbf128e2d7437fd870d586250d
parentEvas textblock: fix case of own_closer in style_set (diff)
downloadefl-0a7726252427029ee8506d33ce2d4447bd5e17c4.tar.gz
eet - improve eet file storage when encoding by aligning data
this forces data when written to be aligned to 8 bytes. this makes mapping keys directly far better as from now on you can assume all data is aligned to 8 bytes allowing you, if you want, to use eet files as caches for raw binary data you mmap directly and just use (not portable though). @feat
-rw-r--r--src/lib/eet/eet_lib.c41
1 files changed, 38 insertions, 3 deletions
diff --git a/src/lib/eet/eet_lib.c b/src/lib/eet/eet_lib.c
index 129e93fbd5..579dc28faf 100644
--- a/src/lib/eet/eet_lib.c
+++ b/src/lib/eet/eet_lib.c
@@ -57,6 +57,10 @@ EAPI Eet_Version *eet_version = &_version;
#define EET_FILE2_DICTIONARY_ENTRY_SIZE (sizeof(int) * \
EET_FILE2_DICTIONARY_ENTRY_COUNT)
+// force data alignmenmt in the eet file so direct mmap can work without
+// copies and we can work with alignment
+#define ALIGN 8
+
/* prototypes of internal calls */
static Eet_File *
eet_cache_find(const char *path,
@@ -311,9 +315,13 @@ eet_flush2(Eet_File *ef)
int bytes_strings = 0;
int data_offset = 0;
int strings_offset = 0;
+ int data_pad = 0;
+ int pad = 0;
+ int orig_data_offset = 0;
int num;
int i;
int j;
+ unsigned char zeros[8] = { 0, 0, 0, 0, 0, 0, 0, 0 };
if (eet_check_pointer(ef))
return EET_ERROR_BAD_OBJECT;
@@ -382,6 +390,10 @@ eet_flush2(Eet_File *ef)
data_offset = bytes_directory_entries + bytes_dictionary_entries +
bytes_strings;
+ data_pad = (((data_offset + (ALIGN - 1)) / ALIGN) * ALIGN) - data_offset;
+ data_offset += data_pad;
+ orig_data_offset = data_offset;
+
/* write directories entry */
for (i = 0; i < num; i++)
{
@@ -405,6 +417,9 @@ eet_flush2(Eet_File *ef)
strings_offset += efn->name_size;
data_offset += efn->size;
+ pad = (((data_offset + (ALIGN - 1)) / ALIGN) * ALIGN) - data_offset;
+ data_offset += pad;
+
if (fwrite(ibuf, sizeof(ibuf), 1, fp) != 1)
goto write_error;
}
@@ -458,13 +473,30 @@ eet_flush2(Eet_File *ef)
goto write_error;
}
+ if (data_pad > 0)
+ {
+ if (fwrite(zeros, data_pad, 1, fp) != 1)
+ goto write_error;
+ }
+
/* write data */
+ data_offset = orig_data_offset;
for (i = 0; i < num; i++)
{
for (efn = ef->header->directory->nodes[i]; efn; efn = efn->next)
{
if (fwrite(efn->data, efn->size, 1, fp) != 1)
goto write_error;
+
+ data_offset += efn->size;
+
+ pad = (((data_offset + (ALIGN - 1)) / ALIGN) * ALIGN) - data_offset;
+ if (pad > 0)
+ {
+ data_offset += pad;
+ if (fwrite(zeros, pad, 1, fp) != 1)
+ goto write_error;
+ }
}
}
@@ -849,8 +881,11 @@ eet_internal_read2(Eet_File *ef)
}
/* compute the possible position of a signature */
- if (signature_base_offset < efn->offset + efn->size)
- signature_base_offset = efn->offset + efn->size;
+ if (signature_base_offset < (efn->offset + efn->size))
+ {
+ signature_base_offset = efn->offset +
+ (((efn->size + (ALIGN - 1)) / ALIGN) * ALIGN);
+ }
}
ef->ed = NULL;
@@ -1968,7 +2003,7 @@ eet_read_direct(Eet_File *ef,
if (!efn) goto on_error;
/* trick to detect data in memory instead of mmaped from disk */
- if (efn->offset > ef->data_size && !efn->data)
+ if (((efn->offset + efn->size) > ef->data_size) && !efn->data)
goto on_error;
/* get size (uncompressed, if compressed at all) */