aboutsummaryrefslogtreecommitdiff
path: root/include/08.heap/heap23.c
diff options
context:
space:
mode:
authorAleksa Vučković <aleksav013@gmail.com>2022-01-31 11:16:38 +0100
committerAleksa Vučković <aleksav013@gmail.com>2022-01-31 14:03:24 +0100
commit03035c98b4ba3297b837e96080e78e0aac1e86db (patch)
tree55b5f69f83bc8b77ec229062f702c0a4f960e87f /include/08.heap/heap23.c
parent11e780fd0f7bed3594de9a7170fadc88c4d48be8 (diff)
Promene
Diffstat (limited to 'include/08.heap/heap23.c')
-rw-r--r--include/08.heap/heap23.c21
1 files changed, 21 insertions, 0 deletions
diff --git a/include/08.heap/heap23.c b/include/08.heap/heap23.c
new file mode 100644
index 0000000..70305b7
--- /dev/null
+++ b/include/08.heap/heap23.c
@@ -0,0 +1,21 @@
+ 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;
+ }
+ }