| #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; |
| } |