changeset 22:3fb0ec050ff3

malloc has been restructured to now work in a more logical manner malloc now allocates memory from the beginning of a block instead of the end. Additionally, memory is now 8-byte aligned instead of 16-byte aligned. malloc_init should now be called to set up all the memory information. Fixed a bug where malloc would not have iterated to find new memory locations.
author Jonathan Pevarnek <pevarnj@gmail.com>
date Wed, 16 Mar 2011 00:09:35 -0400
parents 7c2adb65ceac
children f68b59af5ea6
files arch/io.c include/std.h src/init.c src/std.c
diffstat 4 files changed, 28 insertions(+), 27 deletions(-) [+]
line wrap: on
line diff
--- a/arch/io.c	Tue Mar 15 22:55:36 2011 -0400
+++ b/arch/io.c	Wed Mar 16 00:09:35 2011 -0400
@@ -178,7 +178,6 @@
 
 /* console I/O functions */
 
-#define CON_LEN 132
 #define CON_DEV 0x0009
 
 struct pmcw {
--- a/include/std.h	Tue Mar 15 22:55:36 2011 -0400
+++ b/include/std.h	Wed Mar 16 00:09:35 2011 -0400
@@ -19,15 +19,13 @@
 
 //MALLOC CODE
 
-union block {
-	struct {
-		union block *next;
-		unsigned int size;
-	} s;
-	double foo;
+struct block{
+	struct block *next;
+	unsigned int size;
 };
-typedef union block Block;
+typedef struct block Block;
 
+void malloc_init(size_t memSize);
 void* malloc(size_t size);
 //void free(void *ptr);
 
--- a/src/init.c	Tue Mar 15 22:55:36 2011 -0400
+++ b/src/init.c	Wed Mar 16 00:09:35 2011 -0400
@@ -24,12 +24,13 @@
   int i, n;
   char *buffer;
 	char input[30];
+	malloc_init(0x1400000); //20MB memory
 
 	while(1) {
 		sPrint("How long do you want the string? ");
 		n = atoi(sGet(input, 30));
 
-		buffer = (char*) malloc(n + 2);
+		buffer = (char*) malloc(n);
 		if (!buffer) { //allocation failed, too large
 			sPrint("ERROR\n");
 			break;
@@ -41,8 +42,8 @@
 
 //		dumpBuffer(buffer, n);
 
-		sPrint(append(itoa((int)buffer, input), "\n"));
-		sPrint(append(buffer, "\n"));
+		sPrint(append(itoa((unsigned long)buffer, input), "\n"));
+		sPrint(buffer), sPrint("\n");
 	}
 /*
 	struct Stack theStack;
--- a/src/std.c	Tue Mar 15 22:55:36 2011 -0400
+++ b/src/std.c	Wed Mar 16 00:09:35 2011 -0400
@@ -128,26 +128,29 @@
 
 static Block *allocp = NULL; //the location of the last item allocated by malloc
 
+void malloc_init(size_t memSize)
+{
+	allocp = (void*)0x200000;
+	allocp->next = allocp;
+	allocp->size = memSize/sizeof(u64);
+}
+
 void* malloc(size_t size)
 {
-	unsigned int nBlocks = 1 + (size + sizeof(Block) - 1)/sizeof(Block);
-	//We are allocating a number of blocks equal to the number needed rounded up
-	//plus one for the actual info block
-	Block *cur, *prev;
-	if(allocp == NULL) {
-		allocp = (void*)0x200000; //this is where memory should start
-		allocp->s.next = allocp;
-		allocp->s.size = (0x1400000/sizeof(Block)); //I am going to limit the heap to 20MB for now
-	}
+	unsigned int nUnits = ((size + sizeof(Block)) + sizeof(u64) - 1)/sizeof(u64);
+	Block *cur, *prev, *temp;
+	if(allocp == NULL) return NULL;
 	prev = allocp;
-	for(cur = prev->s.next;; ) {
-		if(cur->s.size >= nBlocks) { //this section is pretty much exactly copied from K&R
-			if(cur->s.size == nBlocks) {
-				prev->s.next = cur->s.next;
+	for(cur = prev->next;; prev = cur, cur = cur->next) {
+		if(cur->size >= nUnits) {
+			if(cur->size == nUnits) {
+				prev->next = cur->next;
 			} else {
-				cur->s.size -= nBlocks;
-				cur += cur->s.size;
-				cur->s.size = nBlocks;
+				temp = cur + nUnits;
+				temp->size = cur->size - nUnits;
+				temp->next = cur->next;
+				prev->next = temp;
+				cur->size = nUnits;
 			}
 			allocp = prev;
 			return (void*)(cur + 1);