Добавил:
Studfiles2
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:Лабораторная работа №2 / libl2_malloc
.cpp#include <stdio.h>
#include <unistd.h>
#include "l2_malloc.h"
block_group memory[GROUPS_COUNT];
int is_init=0;
int calc_req_size()
{
int result=0;
int size=MIN_SIZE;
for (int i=1; i<=GROUPS_COUNT; i++)
{
result += ( size+sizeof(int) ) * GROUP_SIZE;
size*=2;
}
return result;
}
void l2_malloc_init()
{
int heap_size=calc_req_size();
char* cur_addr=(char*)sbrk(heap_size);
int size=MIN_SIZE;
for (int i=0; i<GROUPS_COUNT; i++)
{
block_group* cur_group=&memory[i];
cur_group->blocks_size=size;
for (int j=0; j<GROUP_SIZE; j++)
{
*(int*)(cur_group->groups[j].addr=cur_addr)=size;
cur_group->groups[j].used=0;
cur_addr += sizeof(int)+size;
}
size*=2;
}
is_init=1;
}
void* l2_malloc(int size)
{
if (!is_init)
l2_malloc_init();
block_group* group = NULL;
for (int i=0; i<GROUPS_COUNT; i++)
{
if (memory[i].blocks_size>=size)
group=&memory[i];
}
if (group==0)
return NULL;
for (int i=0; i<GROUP_SIZE; i++)
{
if (!group->groups[i].used)
{
group->groups[i].used=1;
return
(char*)(group->groups[i].addr)+sizeof(int);
}
}
}
void l2_free(void* block)
{
int* size=(int*)(static_cast<char*>(block)-sizeof(int));
block_group* group=NULL;
for (int i=0; i<GROUPS_COUNT; i++)
{
if (memory[i].blocks_size==*size)
group=&memory[i];
}
if (group==0)
return;
for (int i=0; i<GROUP_SIZE; i++)
{
if ((char*)group->groups[i].addr+sizeof(int)==block)
group->groups[i].used=0;
}
}
Соседние файлы в папке Лабораторная работа №2