Created
May 23, 2015 20:58
-
-
Save jborg/1255a877d288a7a504ef to your computer and use it in GitHub Desktop.
hashindex 32 bit alignment fix
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
diff --git a/attic/_hashindex.c b/attic/_hashindex.c | |
index 3d311dd..4d117f1 100644 | |
--- a/attic/_hashindex.c | |
+++ b/attic/_hashindex.c | |
@@ -18,6 +18,9 @@ | |
#error Unknown byte order | |
#endif | |
+/* Adjustment to make sure buckets locations are 32 bit aligned */ | |
+#define ALIGNMENT_ADJUSTMENT 2 | |
+ | |
typedef struct { | |
char magic[8]; | |
int32_t num_entries; | |
@@ -27,6 +30,7 @@ typedef struct { | |
} __attribute__((__packed__)) HashHeader; | |
typedef struct { | |
+ void *allocated_data; | |
void *data; | |
void *buckets; | |
int num_entries; | |
@@ -120,7 +124,8 @@ hashindex_resize(HashIndex *index, int capacity) | |
while((key = hashindex_next_key(index, key))) { | |
hashindex_set(new, key, hashindex_get(index, key)); | |
} | |
- free(index->data); | |
+ free(index->allocated_data); | |
+ index->allocated_data = new->allocated_data; | |
index->data = new->data; | |
index->data_len = new->data_len; | |
index->num_buckets = new->num_buckets; | |
@@ -177,12 +182,13 @@ hashindex_read(const char *path) | |
EPRINTF_PATH(path, "malloc failed"); | |
goto fail; | |
} | |
- if(!(index->data = malloc(length))) { | |
+ if(!(index->allocated_data = malloc(length))) { | |
EPRINTF_PATH(path, "malloc failed"); | |
free(index); | |
index = NULL; | |
goto fail; | |
} | |
+ index->data = index->allocated_data + ALIGNMENT_ADJUSTMENT; | |
if(fread(index->data, 1, length, fd) != length) { | |
if(ferror(fd)) { | |
EPRINTF_PATH(path, "fread failed"); | |
@@ -190,7 +196,7 @@ hashindex_read(const char *path) | |
else { | |
EPRINTF_MSG_PATH(path, "failed to read %ld bytes", length); | |
} | |
- free(index->data); | |
+ free(index->allocated_data); | |
free(index); | |
index = NULL; | |
goto fail; | |
@@ -226,11 +232,12 @@ hashindex_init(int capacity, int key_size, int value_size) | |
return NULL; | |
} | |
index->data_len = sizeof(HashHeader) + (off_t)capacity * (key_size + value_size); | |
- if(!(index->data = calloc(index->data_len, 1))) { | |
+ if(!(index->allocated_data = calloc(index->data_len, 1))) { | |
EPRINTF("malloc failed"); | |
free(index); | |
return NULL; | |
} | |
+ index->data = index->allocated_data + ALIGNMENT_ADJUSTMENT; | |
index->num_entries = 0; | |
index->key_size = key_size; | |
index->value_size = value_size; | |
@@ -249,7 +256,7 @@ hashindex_init(int capacity, int key_size, int value_size) | |
static void | |
hashindex_free(HashIndex *index) | |
{ | |
- free(index->data); | |
+ free(index->allocated_data); | |
free(index); | |
} | |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment