15 #if GFX_OS_HEAP_SIZE == 0
18 void _gosHeapInit(
void) {
24 void *
gfxRealloc(
void *ptr, gMemSize oldsz, gMemSize newsz) {
26 return realloc(ptr, newsz);
36 typedef struct memslot {
41 typedef struct freeslot {
45 #define GetSlotSize(sz) ((((sz) + (sizeof(freeslot) - 1)) & ~(sizeof(freeslot) - 1)) + sizeof(memslot))
46 #define NextFree(pslot) ((freeslot *)Slot2Ptr(pslot))->nextfree
47 #define Ptr2Slot(p) ((memslot *)(p) - 1)
48 #define Slot2Ptr(pslot) ((pslot)+1)
50 static memslot * freeSlots;
53 void _gosHeapInit(
void) {
57 void gfxAddHeapBlock(
void *ptr, gMemSize sz) {
58 if (sz <
sizeof(memslot)+
sizeof(freeslot))
61 ((memslot *)ptr)->sz = sz;
62 gfxFree(Slot2Ptr((memslot *)ptr));
66 register memslot *prev, *p, *pnew;
70 for (prev = 0, p = freeSlots; p != 0; prev = p, p = NextFree(p)) {
76 if (p->sz >= sz +
sizeof(memslot)+
sizeof(freeslot)) {
77 pnew = (memslot *)((
char *)p + sz);
78 pnew->sz = p->sz - sz;
80 NextFree(pnew) = NextFree(p);
86 NextFree(prev) = NextFree(p);
88 freeSlots = NextFree(p);
97 void *
gfxRealloc(
void *ptr, gMemSize oldsz, gMemSize sz) {
98 register memslot *prev, *p, *pfree;
109 sz = GetSlotSize(sz);
112 for (prev = 0, pfree = freeSlots; pfree != 0; prev = pfree, pfree = NextFree(pfree)) {
113 if (pfree == (memslot *)((
char *)p + p->sz)) {
116 NextFree(prev) = NextFree(pfree);
118 freeSlots = NextFree(pfree);
126 if (p->sz >= sz +
sizeof(memslot)+
sizeof(freeslot)) {
127 pfree = (memslot *)((
char *)p + sz);
128 pfree->sz = p->sz - sz;
130 NextFree(pfree) = freeSlots;
140 memcpy(pfree, ptr, p->sz -
sizeof(memslot));
146 register memslot *prev, *p, *pfree;
154 for (prev = 0, pfree = freeSlots; pfree != 0; prev = pfree, pfree = NextFree(pfree)) {
155 if (p == (memslot *)((
char *)pfree + pfree->sz)) {
158 NextFree(prev) = NextFree(pfree);
160 freeSlots = NextFree(pfree);
167 for (prev = 0, pfree = freeSlots; pfree != 0; prev = pfree, pfree = NextFree(pfree)) {
168 if (pfree == (memslot *)((
char *)p + p->sz)) {
171 NextFree(prev) = NextFree(pfree);
173 freeSlots = NextFree(pfree);
179 NextFree(p) = freeSlots;
186 #if GFX_EMULATE_MALLOC
189 void* malloc(
size_t size) {
192 void free(
void *ptr) {
#define GFX_OS_HEAP_SIZE
How much RAM should uGFX use for the heap when using its own internal heap allocator.
void * gfxAlloc(gMemSize sz)
Allocate memory.
void * gfxRealloc(void *ptr, gMemSize oldsz, gMemSize newsz)
Re-allocate memory.
void gfxFree(void *ptr)
Free memory.