]> git.ipfire.org Git - thirdparty/systemd.git/blame - src/test/test-mempool.c
tree-wide: drop space between variable and an increment/decrement
[thirdparty/systemd.git] / src / test / test-mempool.c
CommitLineData
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
7struct element {
8 uint64_t value;
9};
10
11DEFINE_MEMPOOL(test_mempool, struct element, 8);
12
13TEST(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
92DEFINE_TEST_MAIN(LOG_DEBUG);