void *adu_calloc(size_t size)
{
void *ret = malloc(size);
+
+ if (!ret)
+ exit(EXIT_FAILURE);
memset(ret, 0, size);
return ret;
}
}
/**
- * Initialize a bloom filter.
+ * Allocate and initialize a new bloom filter.
*
* \param order Use a filter containing 2^order bits.
* \param num_hash_functions Set that many bits in the filter per entry.
+ *
+ * \return This function either returns a freshly allocated and initialized
+ * bloom filter or does not return at all (if the underlying malloc() failed).
*/
-int bloom_init(unsigned order, unsigned num_hash_functions,
- struct bloom **result)
+struct bloom *bloom_new(unsigned order, unsigned num_hash_functions)
{
struct bloom *b = adu_calloc(sizeof(*b));
b->order = order;
b->num_hash_functions = num_hash_functions;
b->filter = adu_calloc(filter_bits(b) / 8);
- *result = b;
- return 1;
+ return b;
}
#ifdef TEST_BLOOM
printf("k: # of hash functions to use\n");
exit(1);
}
- bloom_init(atoi(argv[1]), atoi(argv[2]), &b);
+ b = bloom_new(atoi(argv[1]), atoi(argv[2]));
add_stdin(b);
INFO_LOG("%u%% of bits are set\n", (unsigned)
(b->num_set_bits * 100ULL / filter_bits(b)));
uint8_t *filter;
};
-int bloom_init(unsigned bloom_filter_order, unsigned num_hash_functions,
- struct bloom **result);
+struct bloom *bloom_new(unsigned order, unsigned num_hash_functions);
void bloom_free(struct bloom *b);
int bloom_test_and_insert(const uint8_t *data, size_t len, struct bloom *b);
if (!S_ISDIR(statbuf.st_mode))
return -ERRNO_TO_ERROR(ENOTDIR);
if (order >= 10 && num > 0) {
- bloom_init(order, num, &global_bloom_filter);
- bloom_init(order, num, &user_bloom_filter);
+ global_bloom_filter = bloom_new(order, num);
+ user_bloom_filter = bloom_new(order, num);
} else
WARNING_LOG("hard link detection deactivated\n");
device_id = statbuf.st_dev;