10 LibDmem::LibDmem(
void* buffer,
size_t size) {
11 mBeginning = (SEGMENT*) buffer;
12 SEGMENT* last = (SEGMENT*) (((uint8_t*) buffer) + size - SIZE_OF_CTRL);
15 mBeginning->next = last;
18 last->prev = mBeginning;
22 mFree = (uint8_t*) last - (uint8_t*) mBeginning - SIZE_OF_CTRL;
31 void* LibDmem::alloc(
size_t size) {
33 size = ALIGN_TO_SIZE(size, 4);
34 size_t requiredSize = size + SIZE_OF_CTRL;
35 size_t smallestGap = SIZE_MAX;
37 for (SEGMENT* iterator = mBeginning; iterator->next; iterator = iterator->next) {
38 size_t currentGap = (uint8_t*) iterator->next - (uint8_t*) iterator - iterator->size - SIZE_OF_CTRL;
40 if (currentGap == requiredSize) {
44 if (currentGap >= requiredSize) {
45 if (currentGap < smallestGap) {
47 smallestGap = currentGap;
56 SEGMENT* seg = (SEGMENT*) (((uint8_t*) prev) + prev->size + SIZE_OF_CTRL);
59 seg->next = prev->next;
61 seg->next->prev = seg;
64 mFree -= requiredSize;
66 return ((uint8_t*) seg) + SIZE_OF_CTRL;
69 void LibDmem::free(
void* p) {
70 LIB_ASSERT((p != 0)&&(p > mBeginning) && (p < (((uint8_t*)mBeginning)+mTotalSize)));
72 SEGMENT* seg = (SEGMENT*) (((uint8_t*) p) - SIZE_OF_CTRL);
74 seg->prev->next = seg->next;
75 seg->next->prev = seg->prev;
78 mFree += seg->size + SIZE_OF_CTRL;
79 if (mFree > mTotalSize) {
80 __asm
volatile(
"nop\n");
84 void* LibDmem::resize(
void* p,
size_t size) {
85 LIB_ASSERT((p != 0)&&(p > mBeginning) && (p < (((uint8_t*)mBeginning)+mTotalSize)));
95 size = ALIGN_TO_SIZE(size, 4);
96 SEGMENT* seg = (SEGMENT*) (((uint8_t*) p) - SIZE_OF_CTRL);
98 size_t available = (uint8_t*) seg->next - (uint8_t*) seg - SIZE_OF_CTRL;
99 if (size <= available) {
100 mFree += seg->size - size;
106 void* newSeg = alloc(size);
111 memcpy(newSeg, p, seg->size);
116 void* LibDmem::resizeLeft(
void* p,
size_t left) {
117 LIB_ASSERT((p != 0)&&(p > mBeginning) && (p < (((uint8_t*)mBeginning)+mTotalSize)));
118 LIB_ASSERT((left%4)==0);
120 SEGMENT* oldSeg = (SEGMENT*) (((uint8_t*) p) - SIZE_OF_CTRL);
122 if (left > oldSeg->size) {
126 SEGMENT* newSeg = (SEGMENT*) (((uint8_t*) oldSeg) + left);
128 SEGMENT* prev = oldSeg->prev;
129 SEGMENT* next = oldSeg->next;
130 size_t size = oldSeg->size - left;
144 return ((uint8_t*) newSeg) + SIZE_OF_CTRL;
147 size_t LibDmem::getTotalMemory() {
151 size_t LibDmem::getFreeMemory() {
155 unsigned int LibDmem::getBlockCount() {