Files
HDH/Lab4/ex1_bak.c
T
2019-11-17 15:06:20 +07:00

87 lines
2.3 KiB
C

#include "ex1.h"
/* Tim block trong */
memNode *findFree(size_t size)
{
memNode *cur = head;
while (cur != NULL)
{
if (cur->isFree == 1 && cur->size >= size)
return cur;
cur = cur->next;
}
return NULL;
}
void *aligned_malloc(unsigned int size, unsigned int align)
{
if (size == 0)
return NULL;
/* Kiem tra so mu cua 2 */
if (ceil(log2((float)align)) != floor(log2((float)align)))
return NULL;
/* Tong gia tri do lon cua block can xin */
unsigned int total_size = size + align - 1 + sizeof(memNode);
memNode *header = findFree(total_size);
void *ret = NULL;
if (header != NULL)
{
header->isFree = 0;
ret = (void *)(((size_t)header + sizeof(memNode) + align - 1) & ~((size_t)align - 1));
*((void **)((size_t)ret - sizeof(memNode))) = header;
return ret;
}
void *block = sbrk(total_size);
if (block == (void *)-1)
return NULL;
header = block;
header->size = total_size;
header->block = (size_t)block;
header->isFree = 0;
header->next = NULL;
if (head == NULL)
head = header;
if (tail != NULL)
tail->next = header;
tail = header;
/* Tim vi tri tra ve thoa man */
ret = (void *)(((size_t)header + sizeof(memNode) + align - 1) & ~((size_t)align - 1));
/* Luu tru thong tin block tai khong gian truoc gia tri tra ve */
*((void **)((size_t)ret - sizeof(memNode))) = header;
return ret;
}
void aligned_free(void *ptr)
{
if (ptr == NULL)
return;
/* Lay lai thong tin cua block */
memNode *header = (memNode *)((size_t)ptr - sizeof(memNode));
void *prgBrk = sbrk(0);
/* Neu block nam o sat diem break */
if (header->block + header->size == (size_t)prgBrk)
{
if (head == tail)
{
head = NULL;
tail = NULL;
}
else
{
memNode *tmp = head;
while (tmp != NULL)
{
if (tmp->next == tail)
{
tmp->next = NULL;
tail = tmp;
}
tmp = tmp->next;
}
}
sbrk(0 - (unsigned int)header->size - sizeof(memNode));
return;
}
header->isFree = 1;
}