diskhash 0.0.2.1 → 0.0.2.3
raw patch · 3 files changed
+28/−11 lines, 3 filesPVP ok
version bump matches the API change (PVP)
API changes (from Hackage documentation)
Files
- ChangeLog +6/−0
- diskhash.cabal +1/−1
- src/diskhash.c +21/−10
ChangeLog view
@@ -1,3 +1,9 @@+Version 0.0.2.3 2017-10-24 by luispedro+ * Fix crashes on very large hashes++Version 0.0.2.2 2017-10-23 by luispedro+ * Better error message for ftruncate failures+ Version 0.0.2.1 2017-10-12 by luispedro * Export reserve() in Python interface
diskhash.cabal view
@@ -1,5 +1,5 @@ name: diskhash-version: 0.0.2.1+version: 0.0.2.3 synopsis: Disk-based hash table description: Disk-based hash table category: Data
src/diskhash.c view
@@ -85,6 +85,7 @@ static uint64_t get_table_at(const HashTable* ht, uint64_t ix) {+ assert(ix < cheader_of(ht)->cursize_); if (is_64bit(ht)) { uint64_t* table = (uint64_t*)hashtable_of((HashTable*)ht); return table[ix];@@ -112,7 +113,7 @@ "\tslots used = %ld\n" "\n", cheader_of(ht)->magic, (int)cheader_of(ht)->cursize_, cheader_of(ht)->slots_used_); - int i;+ uint64_t i; for (i = 0; i < cheader_of(ht)->cursize_; ++i) { fprintf(stderr, "\tTable [ %d ] = %d\n",(int)i, (int)get_table_at(ht, i)); }@@ -173,7 +174,12 @@ needs_init = 1; rp->datasize_ = sizeof(HashTableHeader) + 7 * sizeof(uint32_t) + 3 * node_size_opts(opts); if (ftruncate(fd, rp->datasize_) < 0) {- if (err) { *err = strdup("Could not allocate disk space."); }+ if (err) {+ *err = malloc(256);+ if (*err) {+ snprintf(*err, 256, "Could not allocate disk space. Error: %s.", strerror(errno));+ }+ } close(rp->fd_); free((char*)rp->fname_); free(rp);@@ -263,11 +269,11 @@ if (header_of(ht)->cursize_ / 2 > cap) { return header_of(ht)->cursize_ / 2; }- const int starting_slots = cheader_of(ht)->slots_used_;- const int min_slots = cap * 2 + 1;- int i = 0;+ const uint64_t starting_slots = cheader_of(ht)->slots_used_;+ const uint64_t min_slots = cap * 2 + 1;+ uint64_t i = 0; while (primes[i] && primes[i] < min_slots) ++i;- const int n = primes[i];+ const uint64_t n = primes[i]; cap = n / 2; const size_t sizeof_table_elem = is_64bit(ht) ? sizeof(uint64_t) : sizeof(uint32_t); const size_t total_size = sizeof(HashTableHeader) + n * sizeof_table_elem + cap * node_size(ht);@@ -285,7 +291,12 @@ free((char*)temp_ht->fname_); } if (ftruncate(temp_ht->fd_, total_size) < 0) {- if (err) { *err = strdup("Could not allocate disk space."); }+ if (err) {+ *err = malloc(256);+ if (*err) {+ snprintf(*err, 256, "Could not allocate disk space. Error: %s.", strerror(errno));+ }+ } free((char*)temp_ht->fname_); free(temp_ht); return 0;@@ -355,8 +366,8 @@ } void* dht_lookup(const HashTable* ht, const char* key) {- int h = hash_key(key) % cheader_of(ht)->cursize_;- int i;+ uint64_t h = hash_key(key) % cheader_of(ht)->cursize_;+ uint64_t i; for (i = 0; i < cheader_of(ht)->cursize_; ++i) { HashTableEntry et = entry_at(ht, h); if (!et.ht_key) return NULL;@@ -381,7 +392,7 @@ if (cheader_of(ht)->cursize_ / 2 <= cheader_of(ht)->slots_used_) { if (!dht_reserve(ht, cheader_of(ht)->slots_used_ + 1, err)) return -ENOMEM; }- int h = hash_key(key) % cheader_of(ht)->cursize_;+ uint64_t h = hash_key(key) % cheader_of(ht)->cursize_; while (1) { HashTableEntry et = entry_at(ht, h); if (entry_empty(et)) break;