Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Скачиваний:
18
Добавлен:
01.05.2014
Размер:
1.56 Кб
Скачать
#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