2 #include <stdio.h> // temporary
5 #include "block_pool.h"
8 static uint8_t masks[8] = {0xff, 0xfe, 0xfc, 0xf8, 0xf0, 0xe0, 0xc0, 0x80};
9 static uint8_t bits[8] = {1, 2, 4, 8, 0x10, 0x20, 0x40, 0x80};
11 void block_pool_init(struct block_pool *block_pool, int n_blocks) {
12 block_pool->n_blocks = n_blocks;
13 block_pool->n_bitmap = (n_blocks + 7) >> 3;
14 block_pool->bitmap = malloc(block_pool->n_bitmap);
15 rassert(block_pool->bitmap);
16 memset(block_pool->bitmap, 0xff, block_pool->n_bitmap);
18 block_pool->bitmap[n_blocks >> 3] =
21 block_pool->avail = n_blocks;
24 // note: size argument can be negative, indicates a no-op
25 bool block_pool_alloc(struct block_pool *block_pool, int *table, int size) {
29 if (block_pool->avail < size)
32 for (i = 0; i < size; ++i) {
33 j = block_pool->next >> 3;
34 c = block_pool->bitmap[j] & masks[block_pool->next & 7];
36 for (; j < block_pool->n_bitmap; ++j) {
37 c = block_pool->bitmap[j];
43 assert(j <= block_pool->next >> 3);
44 c = block_pool->bitmap[j];
48 k = (block_pool->next >> 3) + 1;
49 for (j = 0; j < k; ++j) {
50 c = block_pool->bitmap[j];
53 core_block_free(table, i);
58 for (k = 0; (c & 1) == 0; ++k)
60 block_pool->bitmap[j] &= ~bits[k];
61 block_pool->next = (j << 3) | k;
63 #ifndef NDEBUG // makes us remove the following line in gen.sh as appropriate
64 assert(table[i] == 0x55555555);
66 //printf("block_pool %p table+i %p alloc %d\n", block_pool, table + i, block_pool->next);
67 table[i] = block_pool->next++;
68 if (block_pool->next >= block_pool->n_blocks)
72 block_pool->avail -= i;
76 // note: size argument can be negative, indicates a no-op
77 void block_pool_free(struct block_pool *block_pool, int *table, int size) {
80 for (i = 0; i < size; ++i) {
82 //printf("block_pool %p table+i %p free %d\n", block_pool, table + i, j);
83 assert(j >= 0 && j < block_pool->n_blocks);
86 assert((block_pool->bitmap[j] & bits[k]) == 0);
87 block_pool->bitmap[j] |= bits[k];
89 table[i] = 0x55555555;
93 block_pool->avail += i;