void freeMemory(Memory *mem, int start, int len) { if (len == 0) return ; Node *p = mem->head->next, *q = mem->head; for (; p != NULL; q = p, p = p->next) { if (p->l > start+len-1) { Node *t = newNode(start, start+len-1); t->next = p, q->next = t; mergeMemory(mem); return ; } } q->next = newNode(start, start+len-1); mergeMemory(mem); }
void *findMemory(void *start, void *end, size_t size) { void *ptr; void *memPosition; void *last; size_t memory; memPosition = 0; last = 0; memory = 0; ptr = ((t_metadata *)start)->_nextFree; while (ptr < end && memory < size + (2 * sizeof(t_metadata))) mergeMemory(&memPosition, &memory, &ptr, &last); if (last != memPosition) { ((t_metadata *)memPosition)->_nextFree = ((t_metadata *)last)->_nextFree; ((t_metadata *)memPosition)->_nextElem = ((t_metadata *)last)->_nextElem; } ((t_metadata *)memPosition)->_allocSize = memory; return (memPosition); }