Skip to content

Instantly share code, notes, and snippets.

@jborg
Created May 23, 2015 20:58
Show Gist options
  • Save jborg/1255a877d288a7a504ef to your computer and use it in GitHub Desktop.
Save jborg/1255a877d288a7a504ef to your computer and use it in GitHub Desktop.
hashindex 32 bit alignment fix
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