142 lines
2.3 KiB
C
142 lines
2.3 KiB
C
#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;
|
|
}
|