]>
Commit | Line | Data |
---|---|---|
c144696e LP |
1 | /* SPDX-License-Identifier: LGPL-2.1-or-later */ |
2 | ||
3 | #include "mempool.h" | |
4 | #include "random-util.h" | |
5 | #include "tests.h" | |
6 | ||
7 | struct element { | |
8 | uint64_t value; | |
9 | }; | |
10 | ||
11 | DEFINE_MEMPOOL(test_mempool, struct element, 8); | |
12 | ||
13 | TEST(mempool_trim) { | |
14 | ||
15 | #define NN 4000 | |
16 | struct element *a[NN]; | |
17 | size_t n_freed = 0; | |
18 | ||
19 | assert_se(!test_mempool.first_pool); | |
20 | assert_se(!test_mempool.freelist); | |
21 | ||
22 | mempool_trim(&test_mempool); | |
23 | ||
24 | for (size_t i = 0; i < NN; i++) { | |
25 | assert_se(a[i] = mempool_alloc_tile(&test_mempool)); | |
26 | a[i]->value = i; | |
27 | } | |
28 | ||
29 | mempool_trim(&test_mempool); | |
30 | ||
31 | /* free up to one third randomly */ | |
32 | size_t x = 0; | |
33 | for (size_t i = 0; i < NN/3; i++) { | |
34 | x = (x + random_u64()) % ELEMENTSOF(a); | |
35 | assert_se(!a[x] || a[x]->value == x); | |
36 | ||
37 | if (a[x]) | |
b3a9d980 | 38 | n_freed++; |
c144696e LP |
39 | |
40 | a[x] = mempool_free_tile(&test_mempool, a[x]); | |
41 | } | |
42 | ||
43 | mempool_trim(&test_mempool); | |
44 | ||
45 | /* free definitely at least one third */ | |
46 | for (size_t i = 2; i < NN; i += 3) { | |
47 | assert_se(!a[i] || a[i]->value == i); | |
48 | if (a[i]) | |
b3a9d980 | 49 | n_freed++; |
c144696e LP |
50 | a[i] = mempool_free_tile(&test_mempool, a[i]); |
51 | } | |
52 | ||
53 | mempool_trim(&test_mempool); | |
54 | ||
55 | /* Allocate another set of tiles, which will fill up the free list and allocate some new tiles */ | |
56 | struct element *b[NN]; | |
57 | for (size_t i = 0; i < NN; i++) { | |
58 | assert_se(b[i] = mempool_alloc_tile(&test_mempool)); | |
59 | b[i]->value = ~(uint64_t) i; | |
60 | } | |
61 | ||
62 | mempool_trim(&test_mempool); | |
63 | ||
64 | /* free everything from the original set*/ | |
65 | ||
66 | for (size_t i = 0; i < NN; i += 1) { | |
67 | assert_se(!a[i] || a[i]->value == i); | |
68 | if (a[i]) | |
b3a9d980 | 69 | n_freed++; |
c144696e LP |
70 | a[i] = mempool_free_tile(&test_mempool, a[i]); |
71 | } | |
72 | ||
73 | mempool_trim(&test_mempool); | |
74 | ||
75 | /* and now everything from the second set too */ | |
76 | ||
77 | for (size_t i = 0; i < NN; i += 1) { | |
78 | assert_se(!b[i] || b[i]->value == ~(uint64_t) i); | |
79 | if (b[i]) | |
b3a9d980 | 80 | n_freed++; |
c144696e LP |
81 | b[i] = mempool_free_tile(&test_mempool, b[i]); |
82 | } | |
83 | ||
84 | assert_se(n_freed == NN * 2); | |
85 | ||
86 | mempool_trim(&test_mempool); | |
87 | ||
88 | assert_se(!test_mempool.first_pool); | |
89 | assert_se(!test_mempool.freelist); | |
90 | } | |
91 | ||
92 | DEFINE_TEST_MAIN(LOG_DEBUG); |