changeset 89:5a195ee08eac

Fix memory leak and bug that was preventing First@Dictionary from working properly
author Mike Pavone <pavone@retrodev.com>
date Sat, 31 Jul 2010 00:19:15 -0400
parents f69987c58fa8
children c25d75c2440b
files nworker.rhope runtime/fixed_alloc.c runtime/fixed_alloc.h runtime/object.h
diffstat 4 files changed, 41 insertions(+), 2 deletions(-) [+]
line wrap: on
line diff
--- a/nworker.rhope	Fri Jul 30 19:52:54 2010 -0400
+++ b/nworker.rhope	Sat Jul 31 00:19:15 2010 -0400
@@ -1331,7 +1331,8 @@
 	}{
 		,setref <- [begin setter]Write Field["obj", name]
 		{ 
-			setter <- [[~]Unbox["newval", setref]
+			setter <- [[[~]Unbox["newval", setref]
+			]Release["newval"]
 			]Move["obj", "out"]
 		}
 	}
@@ -1422,7 +1423,16 @@
 
 Register Method@NProgram[prog, name, convention, inputs, outputs: out]
 {
-	out <- [prog]Worker Refs <<[ [[prog]Worker Refs >>]Set[name, Worker Ref[name, convention, inputs, outputs, Yes]]]
+	[[prog]Worker Refs >>]Index[name]
+	{
+		ref <- [[[[~]Inputs <<[ Max[[~]Inputs >>, inputs] ]
+		]Min Inputs <<[ Min[[~]Min Inputs >>, inputs] ]
+		]Outputs <<[ Max[[~]Outputs >>, outputs] ]
+		]Min Outputs <<[ Min[[~]Min Outputs >>, outputs] ]
+	}{
+		ref <- Worker Ref[name, convention, inputs, outputs, Yes]
+	}
+	out <- [prog]Worker Refs <<[ [[prog]Worker Refs >>]Set[name, ref]]
 }
 
 Register Worker@NProgram[prog, name, convention, inputs, outputs: out]
--- a/runtime/fixed_alloc.c	Fri Jul 30 19:52:54 2010 -0400
+++ b/runtime/fixed_alloc.c	Sat Jul 31 00:19:15 2010 -0400
@@ -1,6 +1,7 @@
 #include "fixed_alloc.h"
 #include <stdlib.h>
 #include <string.h>
+#include <stdio.h>
 
 uint16_t max_free[(MAX_SIZE-MIN_SIZE)/STRIDE];
 
@@ -19,6 +20,28 @@
 	return ret;
 }
 
+void print_mem_info(mem_manager * manager)
+{
+	int i,count,freeobjs;
+	mem_block * cur;
+	printf("Free blocks: %d\n", manager->freecount);
+	printf("Full Blocks: %d\n", manager->fullcount);
+	for (i = 0; i < (MAX_SIZE-MIN_SIZE)/STRIDE; i++)
+	{
+		count = 0;
+		freeobjs = 0;
+		cur = manager->inuse[i];
+		while(cur)
+		{
+			count++;
+			freeobjs += ((int)cur->numfree);
+			cur = cur->next;
+		}
+		printf("Bucket %d(size: %d) has %d blocks in use with %d total free slots\n", i, i*STRIDE+MIN_SIZE,count, freeobjs);
+	}
+	fflush(stdout);
+}
+
 void * falloc(size_t size, mem_manager * manager)
 {
 	uint16_t i,bit;
@@ -77,6 +100,7 @@
 	{
 		//Remove from linked list if there are no more free elements
 		manager->inuse[bucket] = block->next;
+		manager->fullcount++;
 		if(block->next)
 			block->next->last = block->last;
 	}
@@ -136,6 +160,7 @@
 		block->next = manager->inuse[bucket];
 		block->last = NULL;
 		manager->inuse[bucket] = block;
+		manager->fullcount--;
 		if(block->next)
 			block->next->last = block;
 	} else if(block->next && block->next->numfree < block->numfree) {
--- a/runtime/fixed_alloc.h	Fri Jul 30 19:52:54 2010 -0400
+++ b/runtime/fixed_alloc.h	Sat Jul 31 00:19:15 2010 -0400
@@ -30,11 +30,13 @@
 	mem_block *freelist;
 	mem_block *inuse[(MAX_SIZE-MIN_SIZE)/STRIDE];
 	uint32_t freecount;
+	uint32_t fullcount;
 } mem_manager;
 
 void fixed_alloc_init();
 mem_manager * new_mem_manager();
 void * falloc(size_t size, mem_manager * manager);
 void ffree(void * ptr, size_t size, mem_manager * manager);
+void print_mem_info(mem_manager * manager);
 
 #endif //FIXED_ALLOC_H_
--- a/runtime/object.h	Fri Jul 30 19:52:54 2010 -0400
+++ b/runtime/object.h	Sat Jul 31 00:19:15 2010 -0400
@@ -85,6 +85,8 @@
 
 extern blueprint ** registered_types;
 extern uint32_t max_registered_type;
+#include "fixed_alloc.h"
+extern mem_manager * manager;
 
 #define INITIAL_TYPE_STORAGE	32
 #define INITIAL_METHOD_LOOKUP	8