From 03035c98b4ba3297b837e96080e78e0aac1e86db Mon Sep 17 00:00:00 2001 From: Aleksa Vučković Date: Mon, 31 Jan 2022 11:16:38 +0100 Subject: Promene --- include/08.heap/deo1 | 1 - include/08.heap/deo10 | 5 ---- include/08.heap/deo11 | 4 --- include/08.heap/deo12 | 5 ---- include/08.heap/deo13 | 7 ----- include/08.heap/deo14 | 4 --- include/08.heap/deo15 | 3 -- include/08.heap/deo16 | 5 ---- include/08.heap/deo17 | 3 -- include/08.heap/deo18 | 4 --- include/08.heap/deo19 | 4 --- include/08.heap/deo2 | 7 ----- include/08.heap/deo20 | 2 -- include/08.heap/deo21 | 2 -- include/08.heap/deo22 | 2 -- include/08.heap/deo23 | 9 ------ include/08.heap/deo24 | 7 ----- include/08.heap/deo25 | 20 ------------- include/08.heap/deo26 | 3 -- include/08.heap/deo27 | 1 - include/08.heap/deo28 | 4 --- include/08.heap/deo29 | 4 --- include/08.heap/deo3 | 3 -- include/08.heap/deo30 | 4 --- include/08.heap/deo31 | 4 --- include/08.heap/deo4 | 3 -- include/08.heap/deo5 | 5 ---- include/08.heap/deo6 | 3 -- include/08.heap/deo7 | 2 -- include/08.heap/deo8 | 2 -- include/08.heap/deo9 | 4 --- include/08.heap/heap.c | 77 ++++++++++++++++++++++++------------------------ include/08.heap/heap1.c | 2 ++ include/08.heap/heap10.c | 7 +++++ include/08.heap/heap11.c | 8 +++++ include/08.heap/heap12.c | 6 ++++ include/08.heap/heap13.c | 4 +++ include/08.heap/heap14.c | 4 +++ include/08.heap/heap15.c | 5 ++++ include/08.heap/heap16.c | 5 ++++ include/08.heap/heap17.c | 2 ++ include/08.heap/heap18.c | 2 ++ include/08.heap/heap19.c | 2 ++ include/08.heap/heap2.c | 4 +++ include/08.heap/heap20.c | 2 ++ include/08.heap/heap21.c | 10 +++++++ include/08.heap/heap22.c | 8 +++++ include/08.heap/heap23.c | 21 +++++++++++++ include/08.heap/heap24.c | 3 ++ include/08.heap/heap25.c | 1 + include/08.heap/heap26.c | 4 +++ include/08.heap/heap27.c | 4 +++ include/08.heap/heap28.c | 4 +++ include/08.heap/heap29.c | 4 +++ include/08.heap/heap3.c | 7 +++++ include/08.heap/heap4.c | 3 ++ include/08.heap/heap5.c | 2 ++ include/08.heap/heap6.c | 2 ++ include/08.heap/heap7.c | 4 +++ include/08.heap/heap8.c | 5 ++++ include/08.heap/heap9.c | 4 +++ 61 files changed, 178 insertions(+), 174 deletions(-) delete mode 100644 include/08.heap/deo1 delete mode 100644 include/08.heap/deo10 delete mode 100644 include/08.heap/deo11 delete mode 100644 include/08.heap/deo12 delete mode 100644 include/08.heap/deo13 delete mode 100644 include/08.heap/deo14 delete mode 100644 include/08.heap/deo15 delete mode 100644 include/08.heap/deo16 delete mode 100644 include/08.heap/deo17 delete mode 100644 include/08.heap/deo18 delete mode 100644 include/08.heap/deo19 delete mode 100644 include/08.heap/deo2 delete mode 100644 include/08.heap/deo20 delete mode 100644 include/08.heap/deo21 delete mode 100644 include/08.heap/deo22 delete mode 100644 include/08.heap/deo23 delete mode 100644 include/08.heap/deo24 delete mode 100644 include/08.heap/deo25 delete mode 100644 include/08.heap/deo26 delete mode 100644 include/08.heap/deo27 delete mode 100644 include/08.heap/deo28 delete mode 100644 include/08.heap/deo29 delete mode 100644 include/08.heap/deo3 delete mode 100644 include/08.heap/deo30 delete mode 100644 include/08.heap/deo31 delete mode 100644 include/08.heap/deo4 delete mode 100644 include/08.heap/deo5 delete mode 100644 include/08.heap/deo6 delete mode 100644 include/08.heap/deo7 delete mode 100644 include/08.heap/deo8 delete mode 100644 include/08.heap/deo9 create mode 100644 include/08.heap/heap1.c create mode 100644 include/08.heap/heap10.c create mode 100644 include/08.heap/heap11.c create mode 100644 include/08.heap/heap12.c create mode 100644 include/08.heap/heap13.c create mode 100644 include/08.heap/heap14.c create mode 100644 include/08.heap/heap15.c create mode 100644 include/08.heap/heap16.c create mode 100644 include/08.heap/heap17.c create mode 100644 include/08.heap/heap18.c create mode 100644 include/08.heap/heap19.c create mode 100644 include/08.heap/heap2.c create mode 100644 include/08.heap/heap20.c create mode 100644 include/08.heap/heap21.c create mode 100644 include/08.heap/heap22.c create mode 100644 include/08.heap/heap23.c create mode 100644 include/08.heap/heap24.c create mode 100644 include/08.heap/heap25.c create mode 100644 include/08.heap/heap26.c create mode 100644 include/08.heap/heap27.c create mode 100644 include/08.heap/heap28.c create mode 100644 include/08.heap/heap29.c create mode 100644 include/08.heap/heap3.c create mode 100644 include/08.heap/heap4.c create mode 100644 include/08.heap/heap5.c create mode 100644 include/08.heap/heap6.c create mode 100644 include/08.heap/heap7.c create mode 100644 include/08.heap/heap8.c create mode 100644 include/08.heap/heap9.c (limited to 'include/08.heap') diff --git a/include/08.heap/deo1 b/include/08.heap/deo1 deleted file mode 100644 index c45e28b..0000000 --- a/include/08.heap/deo1 +++ /dev/null @@ -1 +0,0 @@ -#include diff --git a/include/08.heap/deo10 b/include/08.heap/deo10 deleted file mode 100644 index fd64ff9..0000000 --- a/include/08.heap/deo10 +++ /dev/null @@ -1,5 +0,0 @@ - /* reserve room for bitmap */ - bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize; - for (x = 0; x < bcnt; ++x) { - bm[x] = 5; - } diff --git a/include/08.heap/deo11 b/include/08.heap/deo11 deleted file mode 100644 index a61193b..0000000 --- a/include/08.heap/deo11 +++ /dev/null @@ -1,4 +0,0 @@ - b->lfb = bcnt - 1; - b->used = bcnt; - return 1; -} diff --git a/include/08.heap/deo12 b/include/08.heap/deo12 deleted file mode 100644 index 84c5721..0000000 --- a/include/08.heap/deo12 +++ /dev/null @@ -1,5 +0,0 @@ -static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) { - uint8_t c; - for (c = a + 1; c == b || c == 0; ++c); - return c; -} diff --git a/include/08.heap/deo13 b/include/08.heap/deo13 deleted file mode 100644 index 369c3f3..0000000 --- a/include/08.heap/deo13 +++ /dev/null @@ -1,7 +0,0 @@ -void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { - KHEAPBLOCKBM *b; - uint8_t *bm; - uint32_t bcnt; - uint32_t x, y, z; - uint32_t bneed; - uint8_t nid; diff --git a/include/08.heap/deo14 b/include/08.heap/deo14 deleted file mode 100644 index 8bfb6f0..0000000 --- a/include/08.heap/deo14 +++ /dev/null @@ -1,4 +0,0 @@ - /* iterate blocks */ - for (b = heap->fblock; b; b = b->next) { - /* check if block has enough room */ - if (b->size - (b->used * b->bsize) >= size) { diff --git a/include/08.heap/deo15 b/include/08.heap/deo15 deleted file mode 100644 index a867821..0000000 --- a/include/08.heap/deo15 +++ /dev/null @@ -1,3 +0,0 @@ - bcnt = b->size / b->bsize; - bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize; - bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/deo16 b/include/08.heap/deo16 deleted file mode 100644 index 78f4675..0000000 --- a/include/08.heap/deo16 +++ /dev/null @@ -1,5 +0,0 @@ - for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) { - /* just wrap around */ - if (x >= bcnt) { - x = 0; - } diff --git a/include/08.heap/deo17 b/include/08.heap/deo17 deleted file mode 100644 index d20be4c..0000000 --- a/include/08.heap/deo17 +++ /dev/null @@ -1,3 +0,0 @@ - if (bm[x] == 0) { - /* count free blocks */ - for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y); diff --git a/include/08.heap/deo18 b/include/08.heap/deo18 deleted file mode 100644 index fed8463..0000000 --- a/include/08.heap/deo18 +++ /dev/null @@ -1,4 +0,0 @@ - /* we have enough, now allocate them */ - if (y == bneed) { - /* find ID that does not match left or right */ - nid = k_heapBMGetNID(bm[x - 1], bm[x + y]); diff --git a/include/08.heap/deo19 b/include/08.heap/deo19 deleted file mode 100644 index 9b49484..0000000 --- a/include/08.heap/deo19 +++ /dev/null @@ -1,4 +0,0 @@ - /* allocate by setting id */ - for (z = 0; z < y; ++z) { - bm[x + z] = nid; - } diff --git a/include/08.heap/deo2 b/include/08.heap/deo2 deleted file mode 100644 index 2a69314..0000000 --- a/include/08.heap/deo2 +++ /dev/null @@ -1,7 +0,0 @@ -typedef struct _KHEAPBLOCKBM { - struct _KHEAPBLOCKBM *next; - uint32_t size; - uint32_t used; - uint32_t bsize; - uint32_t lfb; -} KHEAPBLOCKBM; diff --git a/include/08.heap/deo20 b/include/08.heap/deo20 deleted file mode 100644 index f141368..0000000 --- a/include/08.heap/deo20 +++ /dev/null @@ -1,2 +0,0 @@ - /* optimization */ - b->lfb = (x + bneed) - 2; diff --git a/include/08.heap/deo21 b/include/08.heap/deo21 deleted file mode 100644 index 8fd73e2..0000000 --- a/include/08.heap/deo21 +++ /dev/null @@ -1,2 +0,0 @@ - /* count used blocks NOT bytes */ - b->used += y; diff --git a/include/08.heap/deo22 b/include/08.heap/deo22 deleted file mode 100644 index 98c1157..0000000 --- a/include/08.heap/deo22 +++ /dev/null @@ -1,2 +0,0 @@ - return (void*)(x * b->bsize + (uintptr_t)&b[1]); - } diff --git a/include/08.heap/deo23 b/include/08.heap/deo23 deleted file mode 100644 index 21aa8c8..0000000 --- a/include/08.heap/deo23 +++ /dev/null @@ -1,9 +0,0 @@ - /* x will be incremented by one ONCE more in our FOR loop */ - x += (y - 1); - continue; - } - } - } - } - return 0; -} diff --git a/include/08.heap/deo24 b/include/08.heap/deo24 deleted file mode 100644 index e9c116b..0000000 --- a/include/08.heap/deo24 +++ /dev/null @@ -1,7 +0,0 @@ -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; diff --git a/include/08.heap/deo25 b/include/08.heap/deo25 deleted file mode 100644 index 1a22151..0000000 --- a/include/08.heap/deo25 +++ /dev/null @@ -1,20 +0,0 @@ - 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; - } - } diff --git a/include/08.heap/deo26 b/include/08.heap/deo26 deleted file mode 100644 index 11a4697..0000000 --- a/include/08.heap/deo26 +++ /dev/null @@ -1,3 +0,0 @@ - /* this error needs to be raised or reported somehow */ - return; -} diff --git a/include/08.heap/deo27 b/include/08.heap/deo27 deleted file mode 100644 index 6ac75a9..0000000 --- a/include/08.heap/deo27 +++ /dev/null @@ -1 +0,0 @@ -KHEAPBM kheap; diff --git a/include/08.heap/deo28 b/include/08.heap/deo28 deleted file mode 100644 index 6d7223d..0000000 --- a/include/08.heap/deo28 +++ /dev/null @@ -1,4 +0,0 @@ -void kheapinit() -{ - k_heapBMInit(&kheap); -} diff --git a/include/08.heap/deo29 b/include/08.heap/deo29 deleted file mode 100644 index de767a2..0000000 --- a/include/08.heap/deo29 +++ /dev/null @@ -1,4 +0,0 @@ -int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize) -{ - return k_heapBMAddBlock(&kheap,addr,size,bsize); -} diff --git a/include/08.heap/deo3 b/include/08.heap/deo3 deleted file mode 100644 index d07786d..0000000 --- a/include/08.heap/deo3 +++ /dev/null @@ -1,3 +0,0 @@ -typedef struct _KHEAPBM { - KHEAPBLOCKBM *fblock; -} KHEAPBM; diff --git a/include/08.heap/deo30 b/include/08.heap/deo30 deleted file mode 100644 index 22972f4..0000000 --- a/include/08.heap/deo30 +++ /dev/null @@ -1,4 +0,0 @@ -void *kmalloc(uint32_t size) -{ - return k_heapBMAlloc(&kheap,size); -} diff --git a/include/08.heap/deo31 b/include/08.heap/deo31 deleted file mode 100644 index d4d5941..0000000 --- a/include/08.heap/deo31 +++ /dev/null @@ -1,4 +0,0 @@ -void kfree(void *ptr) -{ - k_heapBMFree(&kheap,ptr); -} diff --git a/include/08.heap/deo4 b/include/08.heap/deo4 deleted file mode 100644 index c2dc3b5..0000000 --- a/include/08.heap/deo4 +++ /dev/null @@ -1,3 +0,0 @@ -void k_heapBMInit(KHEAPBM *heap) { - heap->fblock = 0; -} diff --git a/include/08.heap/deo5 b/include/08.heap/deo5 deleted file mode 100644 index 8eda156..0000000 --- a/include/08.heap/deo5 +++ /dev/null @@ -1,5 +0,0 @@ -int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) { - KHEAPBLOCKBM *b; - uint32_t bcnt; - uint32_t x; - uint8_t *bm; diff --git a/include/08.heap/deo6 b/include/08.heap/deo6 deleted file mode 100644 index 024a09a..0000000 --- a/include/08.heap/deo6 +++ /dev/null @@ -1,3 +0,0 @@ - b = (KHEAPBLOCKBM*)addr; - b->size = size - sizeof(KHEAPBLOCKBM); - b->bsize = bsize; diff --git a/include/08.heap/deo7 b/include/08.heap/deo7 deleted file mode 100644 index c816b2c..0000000 --- a/include/08.heap/deo7 +++ /dev/null @@ -1,2 +0,0 @@ - b->next = heap->fblock; - heap->fblock = b; diff --git a/include/08.heap/deo8 b/include/08.heap/deo8 deleted file mode 100644 index 3a9ea03..0000000 --- a/include/08.heap/deo8 +++ /dev/null @@ -1,2 +0,0 @@ - bcnt = b->size / b->bsize; - bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/deo9 b/include/08.heap/deo9 deleted file mode 100644 index 7183948..0000000 --- a/include/08.heap/deo9 +++ /dev/null @@ -1,4 +0,0 @@ - /* clear bitmap */ - for (x = 0; x < bcnt; ++x) { - bm[x] = 0; - } diff --git a/include/08.heap/heap.c b/include/08.heap/heap.c index 99d0a37..3120ed8 100644 --- a/include/08.heap/heap.c +++ b/include/08.heap/heap.c @@ -1,22 +1,14 @@ +#include #include -typedef struct _KHEAPBLOCKBM { - struct _KHEAPBLOCKBM *next; - uint32_t size; - uint32_t used; - uint32_t bsize; - uint32_t lfb; -} KHEAPBLOCKBM; - -typedef struct _KHEAPBM { - KHEAPBLOCKBM *fblock; -} KHEAPBM; - -void k_heapBMInit(KHEAPBM *heap) { +void k_heapBMInit(KHEAPBM *heap) +{ heap->fblock = 0; } -int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsize) { +int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t + bsize) +{ KHEAPBLOCKBM *b; uint32_t bcnt; uint32_t x; @@ -48,13 +40,16 @@ int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t bsiz return 1; } -static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) { +static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b); +static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) +{ uint8_t c; - for (c = a + 1; c == b || c == 0; ++c); + for (c=a+1;c==b||c==0;++c); return c; } -void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { +void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) +{ KHEAPBLOCKBM *b; uint8_t *bm; uint32_t bcnt; @@ -63,33 +58,36 @@ void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { uint8_t nid; /* iterate blocks */ - for (b = heap->fblock; b; b = b->next) { + for (b = heap->fblock; b; b = b->next) + { /* check if block has enough room */ - if (b->size - (b->used * b->bsize) >= size) { + if (b->size - (b->used * b->bsize) >= size) + { bcnt = b->size / b->bsize; - bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : size / b->bsize; + bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : + size / b->bsize; bm = (uint8_t*)&b[1]; - for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) { + for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) + { /* just wrap around */ - if (x >= bcnt) { - x = 0; - } + if (x >= bcnt) x = 0; - if (bm[x] == 0) { + if (bm[x] == 0) + { /* count free blocks */ - for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; ++y); + for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; + ++y); /* we have enough, now allocate them */ - if (y == bneed) { + if (y == bneed) + { /* find ID that does not match left or right */ nid = k_heapBMGetNID(bm[x - 1], bm[x + y]); /* allocate by setting id */ - for (z = 0; z < y; ++z) { - bm[x + z] = nid; - } + for (z = 0; z < y; ++z) bm[x + z] = nid; /* optimization */ b->lfb = (x + bneed) - 2; @@ -100,7 +98,8 @@ void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { return (void*)(x * b->bsize + (uintptr_t)&b[1]); } - /* x will be incremented by one ONCE more in our FOR loop */ + /* x will be incremented by one ONCE more in our FOR loop + * */ x += (y - 1); continue; } @@ -110,7 +109,8 @@ void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) { return 0; } -void k_heapBMFree(KHEAPBM *heap, void *ptr) { +void k_heapBMFree(KHEAPBM *heap, void *ptr) +{ KHEAPBLOCKBM *b; uintptr_t ptroff; uint32_t bi, x; @@ -118,10 +118,13 @@ void k_heapBMFree(KHEAPBM *heap, void *ptr) { 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) { + 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 */ + ptroff = (uintptr_t)ptr - (uintptr_t)&b[1]; /* get offset to get + block */ /* block offset in BM */ bi = ptroff / b->bsize; /* .. */ @@ -130,9 +133,7 @@ void k_heapBMFree(KHEAPBM *heap, void *ptr) { 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; - } + for (x = bi; bm[x] == id && x < max; ++x) bm[x] = 0; /* update free block count */ b->used -= x - bi; return; diff --git a/include/08.heap/heap1.c b/include/08.heap/heap1.c new file mode 100644 index 0000000..24aa321 --- /dev/null +++ b/include/08.heap/heap1.c @@ -0,0 +1,2 @@ +#include +#include diff --git a/include/08.heap/heap10.c b/include/08.heap/heap10.c new file mode 100644 index 0000000..15505de --- /dev/null +++ b/include/08.heap/heap10.c @@ -0,0 +1,7 @@ +static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b); +static uint8_t k_heapBMGetNID(uint8_t a, uint8_t b) +{ + uint8_t c; + for (c=a+1;c==b||c==0;++c); + return c; +} diff --git a/include/08.heap/heap11.c b/include/08.heap/heap11.c new file mode 100644 index 0000000..90d72d6 --- /dev/null +++ b/include/08.heap/heap11.c @@ -0,0 +1,8 @@ +void *k_heapBMAlloc(KHEAPBM *heap, uint32_t size) +{ + KHEAPBLOCKBM *b; + uint8_t *bm; + uint32_t bcnt; + uint32_t x, y, z; + uint32_t bneed; + uint8_t nid; diff --git a/include/08.heap/heap12.c b/include/08.heap/heap12.c new file mode 100644 index 0000000..78285eb --- /dev/null +++ b/include/08.heap/heap12.c @@ -0,0 +1,6 @@ + /* iterate blocks */ + for (b = heap->fblock; b; b = b->next) + { + /* check if block has enough room */ + if (b->size - (b->used * b->bsize) >= size) + { diff --git a/include/08.heap/heap13.c b/include/08.heap/heap13.c new file mode 100644 index 0000000..ab7463c --- /dev/null +++ b/include/08.heap/heap13.c @@ -0,0 +1,4 @@ + bcnt = b->size / b->bsize; + bneed = (size / b->bsize) * b->bsize < size ? size / b->bsize + 1 : + size / b->bsize; + bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/heap14.c b/include/08.heap/heap14.c new file mode 100644 index 0000000..6edcf6f --- /dev/null +++ b/include/08.heap/heap14.c @@ -0,0 +1,4 @@ + for (x = (b->lfb + 1 >= bcnt ? 0 : b->lfb + 1); x != b->lfb; ++x) + { + /* just wrap around */ + if (x >= bcnt) x = 0; diff --git a/include/08.heap/heap15.c b/include/08.heap/heap15.c new file mode 100644 index 0000000..5a39a40 --- /dev/null +++ b/include/08.heap/heap15.c @@ -0,0 +1,5 @@ + if (bm[x] == 0) + { + /* count free blocks */ + for (y = 0; bm[x + y] == 0 && y < bneed && (x + y) < bcnt; + ++y); diff --git a/include/08.heap/heap16.c b/include/08.heap/heap16.c new file mode 100644 index 0000000..206a5e0 --- /dev/null +++ b/include/08.heap/heap16.c @@ -0,0 +1,5 @@ + /* we have enough, now allocate them */ + if (y == bneed) + { + /* find ID that does not match left or right */ + nid = k_heapBMGetNID(bm[x - 1], bm[x + y]); diff --git a/include/08.heap/heap17.c b/include/08.heap/heap17.c new file mode 100644 index 0000000..ff94380 --- /dev/null +++ b/include/08.heap/heap17.c @@ -0,0 +1,2 @@ + /* allocate by setting id */ + for (z = 0; z < y; ++z) bm[x + z] = nid; diff --git a/include/08.heap/heap18.c b/include/08.heap/heap18.c new file mode 100644 index 0000000..f141368 --- /dev/null +++ b/include/08.heap/heap18.c @@ -0,0 +1,2 @@ + /* optimization */ + b->lfb = (x + bneed) - 2; diff --git a/include/08.heap/heap19.c b/include/08.heap/heap19.c new file mode 100644 index 0000000..8fd73e2 --- /dev/null +++ b/include/08.heap/heap19.c @@ -0,0 +1,2 @@ + /* count used blocks NOT bytes */ + b->used += y; diff --git a/include/08.heap/heap2.c b/include/08.heap/heap2.c new file mode 100644 index 0000000..8757694 --- /dev/null +++ b/include/08.heap/heap2.c @@ -0,0 +1,4 @@ +void k_heapBMInit(KHEAPBM *heap) +{ + heap->fblock = 0; +} diff --git a/include/08.heap/heap20.c b/include/08.heap/heap20.c new file mode 100644 index 0000000..98c1157 --- /dev/null +++ b/include/08.heap/heap20.c @@ -0,0 +1,2 @@ + return (void*)(x * b->bsize + (uintptr_t)&b[1]); + } diff --git a/include/08.heap/heap21.c b/include/08.heap/heap21.c new file mode 100644 index 0000000..2ed3f8c --- /dev/null +++ b/include/08.heap/heap21.c @@ -0,0 +1,10 @@ + /* x will be incremented by one ONCE more in our FOR loop + * */ + x += (y - 1); + continue; + } + } + } + } + return 0; +} diff --git a/include/08.heap/heap22.c b/include/08.heap/heap22.c new file mode 100644 index 0000000..88cd773 --- /dev/null +++ b/include/08.heap/heap22.c @@ -0,0 +1,8 @@ +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; 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; + } + } diff --git a/include/08.heap/heap24.c b/include/08.heap/heap24.c new file mode 100644 index 0000000..11a4697 --- /dev/null +++ b/include/08.heap/heap24.c @@ -0,0 +1,3 @@ + /* this error needs to be raised or reported somehow */ + return; +} diff --git a/include/08.heap/heap25.c b/include/08.heap/heap25.c new file mode 100644 index 0000000..6ac75a9 --- /dev/null +++ b/include/08.heap/heap25.c @@ -0,0 +1 @@ +KHEAPBM kheap; diff --git a/include/08.heap/heap26.c b/include/08.heap/heap26.c new file mode 100644 index 0000000..6d7223d --- /dev/null +++ b/include/08.heap/heap26.c @@ -0,0 +1,4 @@ +void kheapinit() +{ + k_heapBMInit(&kheap); +} diff --git a/include/08.heap/heap27.c b/include/08.heap/heap27.c new file mode 100644 index 0000000..de767a2 --- /dev/null +++ b/include/08.heap/heap27.c @@ -0,0 +1,4 @@ +int kheapaddblock(uintptr_t addr,uint32_t size,uint32_t bsize) +{ + return k_heapBMAddBlock(&kheap,addr,size,bsize); +} diff --git a/include/08.heap/heap28.c b/include/08.heap/heap28.c new file mode 100644 index 0000000..22972f4 --- /dev/null +++ b/include/08.heap/heap28.c @@ -0,0 +1,4 @@ +void *kmalloc(uint32_t size) +{ + return k_heapBMAlloc(&kheap,size); +} diff --git a/include/08.heap/heap29.c b/include/08.heap/heap29.c new file mode 100644 index 0000000..d4d5941 --- /dev/null +++ b/include/08.heap/heap29.c @@ -0,0 +1,4 @@ +void kfree(void *ptr) +{ + k_heapBMFree(&kheap,ptr); +} diff --git a/include/08.heap/heap3.c b/include/08.heap/heap3.c new file mode 100644 index 0000000..dceb8a3 --- /dev/null +++ b/include/08.heap/heap3.c @@ -0,0 +1,7 @@ +int k_heapBMAddBlock(KHEAPBM *heap, uintptr_t addr, uint32_t size, uint32_t + bsize) +{ + KHEAPBLOCKBM *b; + uint32_t bcnt; + uint32_t x; + uint8_t *bm; diff --git a/include/08.heap/heap4.c b/include/08.heap/heap4.c new file mode 100644 index 0000000..024a09a --- /dev/null +++ b/include/08.heap/heap4.c @@ -0,0 +1,3 @@ + b = (KHEAPBLOCKBM*)addr; + b->size = size - sizeof(KHEAPBLOCKBM); + b->bsize = bsize; diff --git a/include/08.heap/heap5.c b/include/08.heap/heap5.c new file mode 100644 index 0000000..c816b2c --- /dev/null +++ b/include/08.heap/heap5.c @@ -0,0 +1,2 @@ + b->next = heap->fblock; + heap->fblock = b; diff --git a/include/08.heap/heap6.c b/include/08.heap/heap6.c new file mode 100644 index 0000000..3a9ea03 --- /dev/null +++ b/include/08.heap/heap6.c @@ -0,0 +1,2 @@ + bcnt = b->size / b->bsize; + bm = (uint8_t*)&b[1]; diff --git a/include/08.heap/heap7.c b/include/08.heap/heap7.c new file mode 100644 index 0000000..7183948 --- /dev/null +++ b/include/08.heap/heap7.c @@ -0,0 +1,4 @@ + /* clear bitmap */ + for (x = 0; x < bcnt; ++x) { + bm[x] = 0; + } diff --git a/include/08.heap/heap8.c b/include/08.heap/heap8.c new file mode 100644 index 0000000..fd64ff9 --- /dev/null +++ b/include/08.heap/heap8.c @@ -0,0 +1,5 @@ + /* reserve room for bitmap */ + bcnt = (bcnt / bsize) * bsize < bcnt ? bcnt / bsize + 1 : bcnt / bsize; + for (x = 0; x < bcnt; ++x) { + bm[x] = 5; + } diff --git a/include/08.heap/heap9.c b/include/08.heap/heap9.c new file mode 100644 index 0000000..a61193b --- /dev/null +++ b/include/08.heap/heap9.c @@ -0,0 +1,4 @@ + b->lfb = bcnt - 1; + b->used = bcnt; + return 1; +} -- cgit v1.2.3