# HG changeset patch # User Mike Pavone # Date 1280549955 14400 # Node ID 5a195ee08eac7848140dd2e4e38f02684b3406f1 # Parent f69987c58fa8cd0aba9abb6c375dd12f7d3b21ff Fix memory leak and bug that was preventing First@Dictionary from working properly diff -r f69987c58fa8 -r 5a195ee08eac nworker.rhope --- 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] diff -r f69987c58fa8 -r 5a195ee08eac runtime/fixed_alloc.c --- 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 #include +#include 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) { diff -r f69987c58fa8 -r 5a195ee08eac runtime/fixed_alloc.h --- 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_ diff -r f69987c58fa8 -r 5a195ee08eac runtime/object.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