
#include <stdio.h>
#include <unistd.h>
#include "mem.h"

int main(){

	int err, i, j;
	void *p[8];
	int sizes[8] = { 88, 488, 288, 488, 388, 1216, 88, 956};


	err = Mem_Init(4096, P_FIRSTFIT);
	if(err == -1)
		return -1;

	for(i=0; i<8; i++) {
		p[i] = Mem_Alloc(sizes[i]);
		if(p[i] == NULL)
		
		return -1;
		printf("done allocating i = %d\n", sizes[i]);	
	}

	printf("----------------\nDONE FIRST ROUND ALLOCATIONS\n---------------\n");

	Mem_Dump();
	
	err = Mem_Free(p[5]);
	if(err == -1)
		return -1;
	printf("done freeing p[5]\n");	

	Mem_Dump();

	err = Mem_Free(p[1]);
	if(err == -1)
		return -1;
	printf("done freeing p[1]\n");

	Mem_Dump();

	err = Mem_Free(p[6]);
	if(err == -1)
		return -1;
	printf("done freeing p[6]\n");

	Mem_Dump();

	err = Mem_Free(p[3]);
	if(err == -1)
		return -1;
	printf("done freeing p[3]\n");

	Mem_Dump();

	err = Mem_Free(p[2]);
	if(err == -1)
		return -1;
	printf("done freeing p[2]\n");
	Mem_Dump();


	printf("=============\nDONE FREEING MEMORY ROUND 1\n===============\n");

	Mem_Dump();

	p[1]= Mem_Alloc(1268);
	if(p[1] == NULL)
		return -1;
	printf("done allocating 1268\n");	

	p[5]= Mem_Alloc(1300);
	if(p[5] == NULL)
		return -1;
	printf("done allocating 1300\n");


	printf("------------------\nDONE ALLOCATING ROUND 2\n------------------\n");

	err = Mem_Free(p[7]);
	if(err == -1)
		return -1;
	err = Mem_Free(p[5]);
	if(err == -1)
		return -1;
	err = Mem_Free(p[4]);
	if(err == -1)
		return -1;

	printf("DONE FREEING");

	p[4]= Mem_Alloc(2668);
	if(p[4] == NULL)
		return -1;
	printf("done allocating 2668\n");


	err = Mem_Free(p[0]);
	if(err == -1)
		return -1;
	printf("done freeing p[0]");


	err = Mem_Free(p[1]);
	if(err == -1)
		return -1;
	printf("done freeing p[1]");


	p[0]= Mem_Alloc(1342);
	if(p[0] == NULL)
		return -1;
	printf("done allocating 1342\n");	

	/*
	   void *p[6];
	   int pagesize = 0;
	   int nr_iterations = 5;
	int size;

	pagesize = getpagesize();

	printf("pagesize * 2 = %d\n", pagesize * 2);

	err = Mem_Init(2 * pagesize, P_BESTFIT);
	if(err == -1){
		printf("failed to init a memory chunk\n");
		return -1;
	}

	for(j=0; j< nr_iterations; j++) {
		size = pagesize/32;
		for(i=0; i<6; i++) {
			p[i] =  Mem_Alloc(size);
			if(p[i] == NULL){
				printf("p[%d] failed to allocate %d\n", i, size);
				return -1;
			}
			size = size * 2;
			Mem_Dump();
			printf("done mem_alloc for i = %d\n", i);
		}
		Mem_Dump();	
		size = pagesize/32;
		for(i=0; i<6; i++) {
			err = Mem_Free(p[i]);
			if(err != 0){
				printf("failed to free p[%d]\n", i);
				return -1;
			}	
			size = size * 2;
			printf("done mem_free for i = %d\n", i);
			Mem_Dump();
		}

	}
*/

	/*	for(j=0; j< nr_iterations; j++) {
		size = pagesize/32;
		for(i=0; i<6; i++) {
		p[i] =  Mem_Alloc(size);
		printf("done mem_alloc for i = %d\n", i);
		if(p[i] == NULL){
		printf("p[%d] failed to allocate %d\n", i, size);
		fflush(stdout);
		return -1;
		}
		err = Mem_Free(p[i]);
		if(err != 0){
		printf("error while trying to free p[%d]\n", i);
		return -1;
		}
		size = size * 2;
		printf("done mem_free for i = %d\n", i);
		}
		}
	 */
	/*

	   int pagesize = getpagesize();
	   int size = pagesize/32;	
	   printf("pagesize * 2 = %d\n", pagesize*2);

	   Mem_Init(2 * pagesize, P_WORSTFIT);

	   void* ptr1 = Mem_Alloc(4096);
	   if(ptr1 == NULL){
	   printf("error trying to allocate 4096\n");
	   }
	   Mem_Dump();

	   if(Mem_Free(ptr1) != 0){
	   printf("error trying to free the memory\n");
	   }


	   void* ptr2 = Mem_Alloc(size*2);
	   if(ptr2 == NULL){
	   printf("error trying to allocate %d\n", size*2);
	   }
	   Mem_Dump();

	   void* ptr3 = Mem_Alloc(48);
	   Mem_Dump();
	   void* ptr4 = Mem_Alloc(488);
	   Mem_Dump();

	   printf("done allocating\n");

	   if(Mem_Free(ptr2) != 0){
	   printf("error trying to free memory");
	   }
	   Mem_Dump();

	   ptr2 = Mem_Alloc(7);
	   Mem_Dump();
	 */
	return 0;
}
