diff options
| author | Aleksa Vučković <aleksav013@gmail.com> | 2022-01-02 22:56:02 +0100 |
|---|---|---|
| committer | Aleksa Vučković <aleksav013@gmail.com> | 2022-01-02 22:56:02 +0100 |
| commit | e2b78d20b80d89321d8d9df3ab8ade8407642dfc (patch) | |
| tree | 148cb3bc894b974ae91290e493046120d04987b0 /include/08.heap/heap07.c | |
| parent | ead31873b971044cd3ecb7e40ae03bdb2e6f7642 (diff) | |
Adding code
Diffstat (limited to 'include/08.heap/heap07.c')
| -rw-r--r-- | include/08.heap/heap07.c | 32 |
1 files changed, 32 insertions, 0 deletions
diff --git a/include/08.heap/heap07.c b/include/08.heap/heap07.c new file mode 100644 index 0000000..5686cd4 --- /dev/null +++ b/include/08.heap/heap07.c @@ -0,0 +1,32 @@ +void k_heapBMFree(KHEAPBM *heap, void *ptr) { + KHEAPBLOCKBM *b; + uintptr_t ptroff; + uint32_t bi, x; + uint8_t *bm; + uint8_t id; + uint32_t max; + + for (b = heap->fblock; b; b = b->next) { + if ((uintptr_t)ptr > (uintptr_t)b && (uintptr_t)ptr < (uintptr_t)b + sizeof(KHEAPBLOCKBM) + b->size) { + /* found block */ + ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get block */ + /* block offset in BM */ + bi = ptroff / b->bsize; + /* .. */ + bm = (uint8_t*)&b[1]; + /* clear allocation */ + id = bm[bi]; + /* oddly.. GCC did not optimize this */ + max = b->size / b->bsize; + for (x = bi; bm[x] == id && x < max; ++x) { + bm[x] = 0; + } + /* update free block count */ + b->used -= x - bi; + return; + } + } + + /* this error needs to be raised or reported somehow */ + return; +} |
