| 12 | #define MSIZE 2048 |
| 13 | |
| 14 | static void BenchLockedPool(benchmark::Bench& bench) |
| 15 | { |
| 16 | void *synth_base = reinterpret_cast<void*>(0x08000000); |
| 17 | const size_t synth_size = 1024*1024; |
| 18 | Arena b(synth_base, synth_size, 16); |
| 19 | |
| 20 | std::vector<void*> addr; |
| 21 | for (int x=0; x<ASIZE; ++x) |
| 22 | addr.push_back(nullptr); |
| 23 | uint32_t s = 0x12345678; |
| 24 | bench.run([&] { |
| 25 | int idx = s & (addr.size() - 1); |
| 26 | if (s & 0x80000000) { |
| 27 | b.free(addr[idx]); |
| 28 | addr[idx] = nullptr; |
| 29 | } else if (!addr[idx]) { |
| 30 | addr[idx] = b.alloc((s >> 16) & (MSIZE - 1)); |
| 31 | } |
| 32 | bool lsb = s & 1; |
| 33 | s >>= 1; |
| 34 | if (lsb) |
| 35 | s ^= 0xf00f00f0; // LFSR period 0xf7ffffe0 |
| 36 | }); |
| 37 | for (void *ptr: addr) |
| 38 | b.free(ptr); |
| 39 | addr.clear(); |
| 40 | } |
| 41 | |
| 42 | BENCHMARK(BenchLockedPool); |