#include <stdio.h>
#include <stdlib.h>
#include <fcntl.h>
#include <string.h>
#include <unistd.h>
#include <inttypes.h>
#include "../lib/lfsr.h"
#include "../lib/axmap.h"
void *smalloc(size_t size)
{
return malloc(size);
}
void sfree(void *ptr)
{
free(ptr);
}
static int test_regular(size_t size, int seed)
{
struct fio_lfsr lfsr;
struct axmap *map;
size_t osize;
uint64_t ff;
int err;
printf("Using %llu entries...", (unsigned long long) size);
fflush(stdout);
lfsr_init(&lfsr, size, seed, seed & 0xF);
map = axmap_new(size);
osize = size;
err = 0;
while (size--) {
uint64_t val;
if (lfsr_next(&lfsr, &val)) {
printf("lfsr: short loop\n");
err = 1;
break;
}
if (axmap_isset(map, val)) {
printf("bit already set\n");
err = 1;
break;
}
axmap_set(map, val);
if (!axmap_isset(map, val)) {
printf("bit not set\n");
err = 1;
break;
}
}
if (err)
return err;
ff = axmap_next_free(map, osize);
if (ff != (uint64_t) -1ULL) {
printf("axmap_next_free broken: got %llu\n", (unsigned long long) ff);
return 1;
}
printf("pass!\n");
axmap_free(map);
return 0;
}
static int test_multi(size_t size, unsigned int bit_off)
{
unsigned int map_size = size;
struct axmap *map;
uint64_t val = bit_off;
int i, err;
printf("Test multi %llu entries %u offset...", (unsigned long long) size, bit_off);
fflush(stdout);
map = axmap_new(map_size);
while (val + 128 <= map_size) {
err = 0;
for (i = val; i < val + 128; i++) {
if (axmap_isset(map, val + i)) {
printf("bit already set\n");
err = 1;
break;
}
}
if (err)
break;
err = axmap_set_nr(map, val, 128);
if (err != 128) {
printf("only set %u bits\n", err);
break;
}
err = 0;
for (i = 0; i < 128; i++) {
if (!axmap_isset(map, val + i)) {
printf("bit not set: %llu\n", (unsigned long long) val + i);
err = 1;
break;
}
}
val += 128;
if (err)
break;
}
if (!err)
printf("pass!\n");
axmap_free(map);
return err;
}
int main(int argc, char *argv[])
{
size_t size = (1UL << 23) - 200;
int seed = 1;
if (argc > 1) {
size = strtoul(argv[1], NULL, 10);
if (argc > 2)
seed = strtoul(argv[2], NULL, 10);
}
if (test_regular(size, seed))
return 1;
if (test_multi(size, 0))
return 2;
if (test_multi(size, 17))
return 3;
return 0;
}