aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--cstring/src/cstring.c2
-rw-r--r--filesystem/src/filesystem.c6
-rw-r--r--filesystem/src/path.c2
-rw-r--r--list/include/list.h8
-rw-r--r--list/test/list_test.c2
-rw-r--r--mem/src/mem.c14
-rw-r--r--mem/test/mem_test.c30
-rw-r--r--mempool/README.md23
-rw-r--r--mempool/include/mempool.h2
-rw-r--r--mempool/src/mempool.c15
-rw-r--r--mempool/test/mempool_test.c24
-rw-r--r--plugin/src/plugin.c18
12 files changed, 74 insertions, 72 deletions
diff --git a/cstring/src/cstring.c b/cstring/src/cstring.c
index e308589..100c130 100644
--- a/cstring/src/cstring.c
+++ b/cstring/src/cstring.c
@@ -23,7 +23,7 @@ string string_new(const char* cstr) {
23void string_del(string* str) { 23void string_del(string* str) {
24 if (str->data) { 24 if (str->data) {
25 free((void*)str->data); 25 free((void*)str->data);
26 str->data = 0; 26 str->data = nullptr;
27 str->length = 0; 27 str->length = 0;
28 } 28 }
29} 29}
diff --git a/filesystem/src/filesystem.c b/filesystem/src/filesystem.c
index b228e85..b0c207a 100644
--- a/filesystem/src/filesystem.c
+++ b/filesystem/src/filesystem.c
@@ -27,11 +27,11 @@ size_t get_file_size(FILE* file) {
27void* read_file(const char* filepath) { 27void* read_file(const char* filepath) {
28 assert(filepath); 28 assert(filepath);
29 29
30 void* data = 0; 30 void* data = nullptr;
31 31
32 FILE* file = fopen(filepath, "rb"); 32 FILE* file = fopen(filepath, "rb");
33 if (!file) { 33 if (!file) {
34 return 0; 34 return nullptr;
35 } 35 }
36 const size_t file_size = get_file_size(file); 36 const size_t file_size = get_file_size(file);
37 if (file_size == (size_t)-1) { 37 if (file_size == (size_t)-1) {
@@ -53,5 +53,5 @@ cleanup:
53 if (data) { 53 if (data) {
54 free(data); 54 free(data);
55 } 55 }
56 return 0; 56 return nullptr;
57} 57}
diff --git a/filesystem/src/path.c b/filesystem/src/path.c
index 2ce5a04..544a5d1 100644
--- a/filesystem/src/path.c
+++ b/filesystem/src/path.c
@@ -21,7 +21,7 @@ path path_new(const char* str) {
21void path_del(path* path) { 21void path_del(path* path) {
22 if (path) { 22 if (path) {
23 free(path->data); 23 free(path->data);
24 path->data = 0; 24 path->data = nullptr;
25 path->size = 0; 25 path->size = 0;
26 } 26 }
27} 27}
diff --git a/list/include/list.h b/list/include/list.h
index 24291e1..aadcb88 100644
--- a/list/include/list.h
+++ b/list/include/list.h
@@ -23,7 +23,7 @@ static inline void* alloc(size_t size) {
23 23
24/// Create a new empty list. 24/// Create a new empty list.
25#define make_list(type) \ 25#define make_list(type) \
26 (type##_list) { 0 } 26 (type##_list) { nullptr }
27 27
28/// Delete the list. 28/// Delete the list.
29#define del_list(list) \ 29#define del_list(list) \
@@ -32,7 +32,7 @@ static inline void* alloc(size_t size) {
32 node = node->next; \ 32 node = node->next; \
33 free(cur); \ 33 free(cur); \
34 } \ 34 } \
35 list.head = 0; 35 list.head = nullptr;
36 36
37/// Prepend a value to the list. 37/// Prepend a value to the list.
38#define list_add(list, value) \ 38#define list_add(list, value) \
@@ -76,10 +76,10 @@ static inline void* alloc(size_t size) {
76 node->next->prev = node->prev; \ 76 node->next->prev = node->prev; \
77 } \ 77 } \
78 if (list.head == node) { \ 78 if (list.head == node) { \
79 list.head = 0; \ 79 list.head = nullptr; \
80 } \ 80 } \
81 free(node); \ 81 free(node); \
82 node = 0; \ 82 node = nullptr; \
83 } 83 }
84 84
85/// Iterate over all the items in the list. 85/// Iterate over all the items in the list.
diff --git a/list/test/list_test.c b/list/test/list_test.c
index 418e156..4ac5b5b 100644
--- a/list/test/list_test.c
+++ b/list/test/list_test.c
@@ -52,7 +52,7 @@ TEST_CASE(list_remove_by_value) {
52TEST_CASE(list_remove_by_address) { 52TEST_CASE(list_remove_by_address) {
53 const int N = 3; 53 const int N = 3;
54 54
55 int* ptrs[3] = {0}; 55 int* ptrs[3] = {nullptr};
56 56
57 int_list list = make_list(int); 57 int_list list = make_list(int);
58 for (int i = 0; i < N; ++i) { 58 for (int i = 0; i < N; ++i) {
diff --git a/mem/src/mem.c b/mem/src/mem.c
index 4f5e5ef..9169a9f 100644
--- a/mem/src/mem.c
+++ b/mem/src/mem.c
@@ -46,17 +46,18 @@ void mem_del_(Memory* mem) {
46 if (mem->dynamic) { 46 if (mem->dynamic) {
47 if (mem->chunks) { 47 if (mem->chunks) {
48 free(mem->chunks); 48 free(mem->chunks);
49 mem->chunks = 0; 49 mem->chunks = nullptr;
50 } 50 }
51 if (mem->blocks) { 51 if (mem->blocks) {
52 free(mem->blocks); 52 free(mem->blocks);
53 mem->blocks = 0; 53 mem->blocks = nullptr;
54 } 54 }
55 } 55 }
56} 56}
57 57
58void mem_clear_(Memory* mem) { 58void mem_clear_(Memory* mem) {
59 assert(mem); 59 assert(mem);
60 mem->num_used_blocks = 0;
60 mem->next_free_chunk = 0; 61 mem->next_free_chunk = 0;
61 memset(mem->blocks, 0, mem->num_blocks * mem->block_size_bytes); 62 memset(mem->blocks, 0, mem->num_blocks * mem->block_size_bytes);
62 memset(mem->chunks, 0, mem->num_blocks * sizeof(Chunk)); 63 memset(mem->chunks, 0, mem->num_blocks * sizeof(Chunk));
@@ -113,10 +114,11 @@ void* mem_alloc_(Memory* mem, size_t num_blocks) {
113 return &mem->blocks[chunk_idx * mem->block_size_bytes]; 114 return &mem->blocks[chunk_idx * mem->block_size_bytes];
114 } else { 115 } else {
115 if (mem->trap) { 116 if (mem->trap) {
116 FAIL("Memory allocation failed, increase the allocator's capacity or " 117 FAIL(
117 "avoid fragmentation."); 118 "Memory allocation failed, increase the allocator's capacity or "
119 "avoid fragmentation.");
118 } 120 }
119 return 0; // Large-enough free chunk not found. 121 return nullptr; // Large-enough free chunk not found.
120 } 122 }
121} 123}
122 124
@@ -172,7 +174,7 @@ void mem_free_(Memory* mem, void** chunk_ptr) {
172 174
173 mem->num_used_blocks--; 175 mem->num_used_blocks--;
174 176
175 *chunk_ptr = 0; 177 *chunk_ptr = nullptr;
176} 178}
177 179
178// The handle is the chunk's index. We don't call it an index in the public API 180// The handle is the chunk's index. We don't call it an index in the public API
diff --git a/mem/test/mem_test.c b/mem/test/mem_test.c
index 14718a5..a8d482f 100644
--- a/mem/test/mem_test.c
+++ b/mem/test/mem_test.c
@@ -39,7 +39,7 @@ TEST_CASE(mem_fully_allocate) {
39 39
40 for (int i = 0; i < NUM_BLOCKS; ++i) { 40 for (int i = 0; i < NUM_BLOCKS; ++i) {
41 const int* block = mem_alloc(&mem, 1); 41 const int* block = mem_alloc(&mem, 1);
42 TEST_TRUE(block != 0); 42 TEST_TRUE(block != nullptr);
43 } 43 }
44 44
45 TEST_TRUE(mem_size(&mem) == NUM_BLOCKS); 45 TEST_TRUE(mem_size(&mem) == NUM_BLOCKS);
@@ -50,15 +50,15 @@ TEST_CASE(mem_fill_then_free) {
50 test_mem mem; 50 test_mem mem;
51 mem_make(&mem); 51 mem_make(&mem);
52 52
53 int* blocks[NUM_BLOCKS] = {0}; 53 int* blocks[NUM_BLOCKS] = {nullptr};
54 for (int i = 0; i < NUM_BLOCKS; i++) { 54 for (int i = 0; i < NUM_BLOCKS; i++) {
55 blocks[i] = mem_alloc(&mem, 1); 55 blocks[i] = mem_alloc(&mem, 1);
56 TEST_TRUE(blocks[i] != 0); 56 TEST_TRUE(blocks[i] != nullptr);
57 } 57 }
58 58
59 for (int i = 0; i < NUM_BLOCKS; i++) { 59 for (int i = 0; i < NUM_BLOCKS; i++) {
60 mem_free(&mem, &blocks[i]); 60 mem_free(&mem, &blocks[i]);
61 TEST_EQUAL(blocks[i], 0); // Pointer should be set to 0 on free. 61 TEST_EQUAL(blocks[i], nullptr); // Pointer should be set to 0 on free.
62 } 62 }
63 63
64 TEST_EQUAL(count(&mem), 0); 64 TEST_EQUAL(count(&mem), 0);
@@ -74,12 +74,12 @@ TEST_CASE(mem_allocate_beyond_max_size) {
74 74
75 // Fully allocate the mem. 75 // Fully allocate the mem.
76 for (int i = 0; i < NUM_BLOCKS; ++i) { 76 for (int i = 0; i < NUM_BLOCKS; ++i) {
77 TEST_TRUE(mem_alloc(&mem, 1) != 0); 77 TEST_TRUE(mem_alloc(&mem, 1) != nullptr);
78 } 78 }
79 79
80 // Past the end. 80 // Past the end.
81 for (int i = 0; i < NUM_BLOCKS; ++i) { 81 for (int i = 0; i < NUM_BLOCKS; ++i) {
82 TEST_EQUAL(mem_alloc(&mem, 1), 0); 82 TEST_EQUAL(mem_alloc(&mem, 1), nullptr);
83 } 83 }
84 84
85 TEST_TRUE(mem_size(&mem) == NUM_BLOCKS); 85 TEST_TRUE(mem_size(&mem) == NUM_BLOCKS);
@@ -105,7 +105,7 @@ TEST_CASE(mem_zero_free_block_after_free) {
105 mem_make(&mem); 105 mem_make(&mem);
106 106
107 int* val = mem_alloc(&mem, 1); 107 int* val = mem_alloc(&mem, 1);
108 TEST_TRUE(val != 0); 108 TEST_TRUE(val != nullptr);
109 *val = 177; 109 *val = 177;
110 110
111 int* old_val = val; 111 int* old_val = val;
@@ -131,7 +131,7 @@ TEST_CASE(mem_traverse_partially_full) {
131 131
132 for (int i = 0; i < N; ++i) { 132 for (int i = 0; i < N; ++i) {
133 int* val = mem_alloc(&mem, 1); 133 int* val = mem_alloc(&mem, 1);
134 TEST_TRUE(val != 0); 134 TEST_TRUE(val != nullptr);
135 *val = i + 1; 135 *val = i + 1;
136 } 136 }
137 137
@@ -146,7 +146,7 @@ TEST_CASE(mem_traverse_full) {
146 146
147 for (int i = 0; i < NUM_BLOCKS; ++i) { 147 for (int i = 0; i < NUM_BLOCKS; ++i) {
148 int* val = mem_alloc(&mem, 1); 148 int* val = mem_alloc(&mem, 1);
149 TEST_TRUE(val != 0); 149 TEST_TRUE(val != nullptr);
150 *val = i + 1; 150 *val = i + 1;
151 } 151 }
152 152
@@ -161,7 +161,7 @@ TEST_CASE(mem_get_block) {
161 161
162 for (int i = 0; i < NUM_BLOCKS; ++i) { 162 for (int i = 0; i < NUM_BLOCKS; ++i) {
163 int* block = mem_alloc(&mem, 1); 163 int* block = mem_alloc(&mem, 1);
164 TEST_TRUE(block != 0); 164 TEST_TRUE(block != nullptr);
165 *block = i; 165 *block = i;
166 TEST_EQUAL(mem_get_chunk_handle(&mem, block), (size_t)i); 166 TEST_EQUAL(mem_get_chunk_handle(&mem, block), (size_t)i);
167 } 167 }
@@ -179,7 +179,7 @@ TEST_CASE(mem_fragmentation) {
179 test_mem mem; 179 test_mem mem;
180 mem_make(&mem); 180 mem_make(&mem);
181 181
182 int* blocks[NUM_BLOCKS] = {0}; 182 int* blocks[NUM_BLOCKS] = {nullptr};
183 int next_block = 0; 183 int next_block = 0;
184 184
185#define ALLOC(num_blocks) \ 185#define ALLOC(num_blocks) \
@@ -205,7 +205,7 @@ TEST_CASE(mem_fragmentation) {
205 205
206 // Should be able to allocate 1 chunk of N blocks. 206 // Should be able to allocate 1 chunk of N blocks.
207 const void* chunk = mem_alloc(&mem, NUM_BLOCKS); 207 const void* chunk = mem_alloc(&mem, NUM_BLOCKS);
208 TEST_TRUE(chunk != 0); 208 TEST_TRUE(chunk != nullptr);
209} 209}
210 210
211// Clear and re-use an allocator. 211// Clear and re-use an allocator.
@@ -216,15 +216,17 @@ TEST_CASE(mem_clear_then_reuse) {
216 // Allocate chunks, contents not important. 216 // Allocate chunks, contents not important.
217 for (int i = 0; i < NUM_BLOCKS; ++i) { 217 for (int i = 0; i < NUM_BLOCKS; ++i) {
218 int* chunk = mem_alloc(&mem, 1); 218 int* chunk = mem_alloc(&mem, 1);
219 TEST_TRUE(chunk != 0); 219 TEST_TRUE(chunk != nullptr);
220 } 220 }
221 221
222 mem_clear(&mem); 222 mem_clear(&mem);
223 TEST_EQUAL(mem_size(&mem), 0);
224 TEST_EQUAL(mem_capacity(&mem), NUM_BLOCKS);
223 225
224 // Allocate chunks and assign values 0..N. 226 // Allocate chunks and assign values 0..N.
225 for (int i = 0; i < NUM_BLOCKS; ++i) { 227 for (int i = 0; i < NUM_BLOCKS; ++i) {
226 int* chunk = mem_alloc(&mem, 1); 228 int* chunk = mem_alloc(&mem, 1);
227 TEST_TRUE(chunk != 0); 229 TEST_TRUE(chunk != nullptr);
228 *chunk = i + 1; 230 *chunk = i + 1;
229 } 231 }
230 232
diff --git a/mempool/README.md b/mempool/README.md
index ed2935e..7eb950e 100644
--- a/mempool/README.md
+++ b/mempool/README.md
@@ -1,20 +1,15 @@
1# Mempool 1# Mempool
2 2
3A memory pool implementation. 3A memory pool of fixed-sized blocks with O(1) allocation and deallocation.
4 4
5Each block in the pool is tagged with a boolean value that indicates whether the 5Each block in the pool is tagged with a boolean value that indicates whether the
6block is free or in use. The allocator otherwise maintains little additional 6block is free or in use, as well as a pointer to the next free/used block.
7information. Therefore, some operations have linear-time complexity. 7Blocks thus form two lists, a free list and a used list. The allocator
8Specifically: 8maintains the two lists when allocating/deallocating blocks.
9 9
10- Allocating a block scans the pool for the next free block in linear time. 10The allocator's internal data is stored separately from the block data so that
11- Freeing a block runs in constant time. 11the data remains tightly packed.
12- Iterating over the pool's used blocks is linear over the number of blocks in
13 the pool, as opposed to just the number of used blocks.
14 12
15The allocator's internal data is also stored separately from the main array of 13Free blocks in the mempool always remain zeroed out for convenience of
16blocks so that the block data remains tightly packed. 14programming and debugging. If the application's data structures are valid when
17 15zeroed out, then they do not need to be explicitly initialized.
18For convenience of programming and debugging, free blocks in the mempool always
19remain zeroed out. If your data structures are valid when zeroed out, then you
20do not need to explicitly initialize them.
diff --git a/mempool/include/mempool.h b/mempool/include/mempool.h
index 245173b..04d0313 100644
--- a/mempool/include/mempool.h
+++ b/mempool/include/mempool.h
@@ -106,8 +106,8 @@
106/// It is valid to mempool_free() the object at each step of the iteration. 106/// It is valid to mempool_free() the object at each step of the iteration.
107#define mempool_foreach(POOL, ITER, BODY) \ 107#define mempool_foreach(POOL, ITER, BODY) \
108 { \ 108 { \
109 size_t i = (POOL)->pool.used; \
110 if ((POOL)->pool.num_used_blocks > 0) { \ 109 if ((POOL)->pool.num_used_blocks > 0) { \
110 size_t i = (POOL)->pool.used; \
111 do { \ 111 do { \
112 if ((POOL)->pool.block_info[i].used) { \ 112 if ((POOL)->pool.block_info[i].used) { \
113 __typeof__((POOL)->object[0])* ITER = \ 113 __typeof__((POOL)->object[0])* ITER = \
diff --git a/mempool/src/mempool.c b/mempool/src/mempool.c
index 46f1053..c398c4f 100644
--- a/mempool/src/mempool.c
+++ b/mempool/src/mempool.c
@@ -34,7 +34,7 @@ bool mempool_make_(
34 block_info = calloc(num_blocks, sizeof(BlockInfo)); 34 block_info = calloc(num_blocks, sizeof(BlockInfo));
35 blocks = calloc(num_blocks, block_size_bytes); 35 blocks = calloc(num_blocks, block_size_bytes);
36 pool->dynamic = true; 36 pool->dynamic = true;
37 if ((block_info == 0) || (blocks == 0)) { 37 if ((block_info == nullptr) || (blocks == nullptr)) {
38 return false; 38 return false;
39 } 39 }
40 } else { 40 } else {
@@ -55,19 +55,20 @@ void mempool_del_(mempool* pool) {
55 if (pool->dynamic) { 55 if (pool->dynamic) {
56 if (pool->block_info) { 56 if (pool->block_info) {
57 free(pool->block_info); 57 free(pool->block_info);
58 pool->block_info = 0; 58 pool->block_info = nullptr;
59 } 59 }
60 if (pool->blocks) { 60 if (pool->blocks) {
61 free(pool->blocks); 61 free(pool->blocks);
62 pool->blocks = 0; 62 pool->blocks = nullptr;
63 } 63 }
64 } 64 }
65} 65}
66 66
67void mempool_clear_(mempool* pool) { 67void mempool_clear_(mempool* pool) {
68 assert(pool); 68 assert(pool);
69 pool->head = 0; 69 pool->head = 0;
70 pool->used = 0; 70 pool->used = 0;
71 pool->num_used_blocks = 0;
71 memset(pool->blocks, 0, pool->num_blocks * pool->block_size_bytes); 72 memset(pool->blocks, 0, pool->num_blocks * pool->block_size_bytes);
72 memset(pool->block_info, 0, pool->num_blocks * sizeof(BlockInfo)); 73 memset(pool->block_info, 0, pool->num_blocks * sizeof(BlockInfo));
73 init_free_list(pool); 74 init_free_list(pool);
@@ -81,7 +82,7 @@ void* mempool_alloc_(mempool* pool) {
81 if (pool->trap) { 82 if (pool->trap) {
82 FAIL("mempool allocation failed, increase the pool's capacity."); 83 FAIL("mempool allocation failed, increase the pool's capacity.");
83 } 84 }
84 return 0; // Pool is full. 85 return nullptr; // Pool is full.
85 } 86 }
86 87
87 // Allocate the block. 88 // Allocate the block.
@@ -124,7 +125,7 @@ void mempool_free_(mempool* pool, void** block_ptr) {
124 125
125 pool->num_used_blocks--; 126 pool->num_used_blocks--;
126 127
127 *block_ptr = 0; 128 *block_ptr = nullptr;
128} 129}
129 130
130void* mempool_get_block_(const mempool* pool, size_t block_index) { 131void* mempool_get_block_(const mempool* pool, size_t block_index) {
diff --git a/mempool/test/mempool_test.c b/mempool/test/mempool_test.c
index 843f7e7..6d904bc 100644
--- a/mempool/test/mempool_test.c
+++ b/mempool/test/mempool_test.c
@@ -39,7 +39,7 @@ TEST_CASE(mempool_allocate_until_full) {
39 39
40 for (int i = 0; i < NUM_BLOCKS; ++i) { 40 for (int i = 0; i < NUM_BLOCKS; ++i) {
41 const int* block = mempool_alloc(&pool); 41 const int* block = mempool_alloc(&pool);
42 TEST_TRUE(block != 0); 42 TEST_TRUE(block != nullptr);
43 } 43 }
44 44
45 TEST_TRUE(mempool_size(&pool) == NUM_BLOCKS); 45 TEST_TRUE(mempool_size(&pool) == NUM_BLOCKS);
@@ -50,10 +50,10 @@ TEST_CASE(mempool_fill_then_free) {
50 test_pool pool; 50 test_pool pool;
51 mempool_make(&pool); 51 mempool_make(&pool);
52 52
53 int* blocks[NUM_BLOCKS] = {0}; 53 int* blocks[NUM_BLOCKS] = {nullptr};
54 for (int i = 0; i < NUM_BLOCKS; ++i) { 54 for (int i = 0; i < NUM_BLOCKS; ++i) {
55 blocks[i] = mempool_alloc(&pool); 55 blocks[i] = mempool_alloc(&pool);
56 TEST_TRUE(blocks[i] != 0); 56 TEST_TRUE(blocks[i] != nullptr);
57 } 57 }
58 58
59 for (int i = 0; i < NUM_BLOCKS; ++i) { 59 for (int i = 0; i < NUM_BLOCKS; ++i) {
@@ -74,7 +74,7 @@ TEST_CASE(mempool_allocate_beyond_max_size) {
74 74
75 // Fully allocate the pool. 75 // Fully allocate the pool.
76 for (int i = 0; i < NUM_BLOCKS; ++i) { 76 for (int i = 0; i < NUM_BLOCKS; ++i) {
77 TEST_TRUE(mempool_alloc(&pool) != 0); 77 TEST_TRUE(mempool_alloc(&pool) != nullptr);
78 } 78 }
79 79
80 // Past the end. 80 // Past the end.
@@ -105,7 +105,7 @@ TEST_CASE(mempool_zero_free_block_after_free) {
105 mempool_make(&pool); 105 mempool_make(&pool);
106 106
107 int* val = mempool_alloc(&pool); 107 int* val = mempool_alloc(&pool);
108 TEST_TRUE(val != 0); 108 TEST_TRUE(val != nullptr);
109 *val = 177; 109 *val = 177;
110 110
111 int* old_val = val; 111 int* old_val = val;
@@ -131,7 +131,7 @@ TEST_CASE(mempool_traverse_partially_full) {
131 131
132 for (int i = 0; i < N; ++i) { 132 for (int i = 0; i < N; ++i) {
133 int* val = mempool_alloc(&pool); 133 int* val = mempool_alloc(&pool);
134 TEST_TRUE(val != 0); 134 TEST_TRUE(val != nullptr);
135 *val = i + 1; 135 *val = i + 1;
136 } 136 }
137 137
@@ -146,7 +146,7 @@ TEST_CASE(mempool_traverse_full) {
146 146
147 for (int i = 0; i < NUM_BLOCKS; ++i) { 147 for (int i = 0; i < NUM_BLOCKS; ++i) {
148 int* val = mempool_alloc(&pool); 148 int* val = mempool_alloc(&pool);
149 TEST_TRUE(val != 0); 149 TEST_TRUE(val != nullptr);
150 *val = i + 1; 150 *val = i + 1;
151 } 151 }
152 152
@@ -161,7 +161,7 @@ TEST_CASE(mempool_get_block) {
161 161
162 for (int i = 0; i < NUM_BLOCKS; ++i) { 162 for (int i = 0; i < NUM_BLOCKS; ++i) {
163 int* block = mempool_alloc(&pool); 163 int* block = mempool_alloc(&pool);
164 TEST_TRUE(block != 0); 164 TEST_TRUE(block != nullptr);
165 *block = i; 165 *block = i;
166 TEST_EQUAL(mempool_get_block_index(&pool, block), (size_t)i); 166 TEST_EQUAL(mempool_get_block_index(&pool, block), (size_t)i);
167 } 167 }
@@ -178,16 +178,18 @@ TEST_CASE(mem_clear_then_reuse) {
178 178
179 // Allocate chunks, contents not important. 179 // Allocate chunks, contents not important.
180 for (int i = 0; i < NUM_BLOCKS; ++i) { 180 for (int i = 0; i < NUM_BLOCKS; ++i) {
181 int* chunk = mempool_alloc(&mem); 181 const int* chunk = mempool_alloc(&mem);
182 TEST_TRUE(chunk != 0); 182 TEST_TRUE(chunk != nullptr);
183 } 183 }
184 184
185 mempool_clear(&mem); 185 mempool_clear(&mem);
186 TEST_EQUAL(mempool_size(&mem), 0);
187 TEST_EQUAL(mempool_capacity(&mem), NUM_BLOCKS);
186 188
187 // Allocate chunks and assign values 0..N. 189 // Allocate chunks and assign values 0..N.
188 for (int i = 0; i < NUM_BLOCKS; ++i) { 190 for (int i = 0; i < NUM_BLOCKS; ++i) {
189 int* chunk = mempool_alloc(&mem); 191 int* chunk = mempool_alloc(&mem);
190 TEST_TRUE(chunk != 0); 192 TEST_TRUE(chunk != nullptr);
191 *chunk = i + 1; 193 *chunk = i + 1;
192 } 194 }
193 195
diff --git a/plugin/src/plugin.c b/plugin/src/plugin.c
index e2aae1f..3a0ef5d 100644
--- a/plugin/src/plugin.c
+++ b/plugin/src/plugin.c
@@ -64,14 +64,14 @@ static bool load_library(Plugin* plugin) {
64 // Handle reloading a previously-loaded library. 64 // Handle reloading a previously-loaded library.
65 if (plugin->handle) { 65 if (plugin->handle) {
66 dlclose(plugin->handle); 66 dlclose(plugin->handle);
67 plugin->handle = 0; 67 plugin->handle = nullptr;
68 } 68 }
69 69
70 const mstring lib = plugin_lib_path(plugin); 70 const mstring lib = plugin_lib_path(plugin);
71 71
72 // If the plugin fails to load, make sure to keep the plugin's old handle to 72 // If the plugin fails to load, make sure to keep the plugin's old handle to
73 // handle the error gracefully. This handles reload failures, specifically. 73 // handle the error gracefully. This handles reload failures, specifically.
74 void* handle = 0; 74 void* handle = nullptr;
75 if ((handle = dlopen(mstring_cstr(&lib), RTLD_NOW))) { 75 if ((handle = dlopen(mstring_cstr(&lib), RTLD_NOW))) {
76 LOGD("Plugin [%s] loaded successfully", mstring_cstr(&plugin->filename)); 76 LOGD("Plugin [%s] loaded successfully", mstring_cstr(&plugin->filename));
77 plugin->handle = handle; 77 plugin->handle = handle;
@@ -86,7 +86,7 @@ static bool load_library(Plugin* plugin) {
86static void delete_plugin_state(Plugin* plugin) { 86static void delete_plugin_state(Plugin* plugin) {
87 if (plugin->state) { 87 if (plugin->state) {
88 free(plugin->state); 88 free(plugin->state);
89 plugin->state = 0; 89 plugin->state = nullptr;
90 } 90 }
91} 91}
92 92
@@ -105,7 +105,7 @@ static void destroy_plugin(Plugin* plugin) {
105 if (plugin) { 105 if (plugin) {
106 if (plugin->handle) { 106 if (plugin->handle) {
107 dlclose(plugin->handle); 107 dlclose(plugin->handle);
108 plugin->handle = 0; 108 plugin->handle = nullptr;
109 } 109 }
110 delete_plugin_state(plugin); 110 delete_plugin_state(plugin);
111 } 111 }
@@ -118,7 +118,7 @@ Plugin* load_plugin(PluginEngine* eng, const char* filename) {
118 Plugin plugin = (Plugin){.eng = eng, .filename = mstring_make(filename)}; 118 Plugin plugin = (Plugin){.eng = eng, .filename = mstring_make(filename)};
119 119
120 if (!load_library(&plugin)) { 120 if (!load_library(&plugin)) {
121 return 0; 121 return nullptr;
122 } 122 }
123 123
124 list_add(eng->plugins, plugin); 124 list_add(eng->plugins, plugin);
@@ -132,7 +132,7 @@ void delete_plugin(Plugin** pPlugin) {
132 assert(plugin->eng); 132 assert(plugin->eng);
133 destroy_plugin(plugin); 133 destroy_plugin(plugin);
134 list_remove_ptr(plugin->eng->plugins, plugin); 134 list_remove_ptr(plugin->eng->plugins, plugin);
135 *pPlugin = 0; 135 *pPlugin = nullptr;
136 } 136 }
137} 137}
138 138
@@ -148,7 +148,7 @@ bool plugin_reloaded(Plugin* plugin) {
148// ----------------------------------------------------------------------------- 148// -----------------------------------------------------------------------------
149 149
150PluginEngine* new_plugin_engine(const PluginEngineDesc* desc) { 150PluginEngine* new_plugin_engine(const PluginEngineDesc* desc) {
151 PluginEngine* eng = 0; 151 PluginEngine* eng = nullptr;
152 152
153 if (!(eng = calloc(1, sizeof(PluginEngine)))) { 153 if (!(eng = calloc(1, sizeof(PluginEngine)))) {
154 goto cleanup; 154 goto cleanup;
@@ -173,7 +173,7 @@ PluginEngine* new_plugin_engine(const PluginEngineDesc* desc) {
173 173
174cleanup: 174cleanup:
175 delete_plugin_engine(&eng); 175 delete_plugin_engine(&eng);
176 return 0; 176 return nullptr;
177} 177}
178 178
179void delete_plugin_engine(PluginEngine** pEng) { 179void delete_plugin_engine(PluginEngine** pEng) {
@@ -191,7 +191,7 @@ void delete_plugin_engine(PluginEngine** pEng) {
191 close(eng->inotify_instance); 191 close(eng->inotify_instance);
192 } 192 }
193 free(eng); 193 free(eng);
194 *pEng = 0; 194 *pEng = nullptr;
195 } 195 }
196} 196}
197 197