[kaffe] CVS kaffe (stack): Change allocation behavior to free large pools of memory after jitting

Kaffe CVS Kaffe Mailing List <kaffe@kaffe.org>
Tue Sep 16 12:26:02 2003


PatchSet 4042 
Date: 2003/09/16 19:23:35
Author: stack
Branch: HEAD
Tag: (none) 
Log:
Change allocation behavior to free large pools of memory after jitting
is done.

Members: 
	ChangeLog:1.1638->1.1639 
	kaffe/kaffevm/jni.c:1.93->1.94 
	kaffe/kaffevm/jit3/constpool.c:1.4->1.5 
	kaffe/kaffevm/jit3/constpool.h:1.4->1.5 
	kaffe/kaffevm/jit3/labels.c:1.9->1.10 
	kaffe/kaffevm/jit3/labels.h:1.7->1.8 
	kaffe/kaffevm/jit3/machine.c:1.40->1.41 

Index: kaffe/ChangeLog
diff -u kaffe/ChangeLog:1.1638 kaffe/ChangeLog:1.1639
--- kaffe/ChangeLog:1.1638	Tue Sep 16 14:49:34 2003
+++ kaffe/ChangeLog	Tue Sep 16 19:23:35 2003
@@ -1,3 +1,14 @@
+2003-09-16  Timothy S. Stack <stack@cs.utah.edu>
+
+	* kaffe/kaffevm/jit3/jni.c,
+	kaffe/kaffevm/jit3/constpool.h,
+	kaffe/kaffevm/jit3/constpool.c,
+	kaffe/kaffevm/jit3/labels.h,
+	kaffe/kaffevm/jit3/labels.c,
+	kaffe/kaffevm/jit3/machine.c:
+	Change allocation behavior to free large pools of memory after
+	jitting is done.
+	
 2003-09-16  Dalibor Topic <robilad@kaffe.org>
 
 	* developers/patch-libtool-amiga.diff,
Index: kaffe/kaffe/kaffevm/jni.c
diff -u kaffe/kaffe/kaffevm/jni.c:1.93 kaffe/kaffe/kaffevm/jni.c:1.94
--- kaffe/kaffe/kaffevm/jni.c:1.93	Mon Sep  1 20:28:02 2003
+++ kaffe/kaffe/kaffevm/jni.c	Tue Sep 16 19:23:37 2003
@@ -4018,6 +4018,9 @@
 		xmeth->accflags |= ACC_JNI;
 
 done:
+	resetConstants();
+	resetLabels();
+
 #if defined(KAFFE_PROFILER)
 	if (profFlag) {
 		profiler_click_t end;
Index: kaffe/kaffe/kaffevm/jit3/constpool.c
diff -u kaffe/kaffe/kaffevm/jit3/constpool.c:1.4 kaffe/kaffe/kaffevm/jit3/constpool.c:1.5
--- kaffe/kaffe/kaffevm/jit3/constpool.c:1.4	Tue Feb 11 16:54:45 2003
+++ kaffe/kaffe/kaffevm/jit3/constpool.c	Tue Sep 16 19:23:38 2003
@@ -20,8 +20,7 @@
 
 #include <stdarg.h>
 
-#define	gc_calloc_fixed(A,B)	gc_malloc((A)*(B), GC_ALLOC_JITTEMP)
-
+static constpoolchunk* poolchunks;
 constpool* firstConst;
 constpool* lastConst;
 constpool* currConst;
@@ -75,14 +74,20 @@
 		c = currConst;
 	}
 
-	if (!c) {
+	if (c == NULL) {
+		constpoolchunk *cpc;
 		int i;
 
 		/* Allocate chunk of constpool elements */
-		c = gc_calloc_fixed(ALLOCCONSTNR, sizeof(constpool));
+		cpc = gc_malloc(sizeof(constpoolchunk), GC_ALLOC_JITTEMP);
 		/* XXX Ack! */
-		assert(c != 0);
+		assert(cpc != 0);
+
+		cpc->next = poolchunks;
+		poolchunks = cpc;
 
+		c = &cpc->data[0];
+		
 		/* Attach to current chain */
 		if (lastConst == 0) {
 			firstConst = c;
@@ -90,13 +95,12 @@
 		else {
 			lastConst->next = c;
 		}
-		lastConst = &c[ALLOCCONSTNR-1];
+		lastConst = &cpc->data[ALLOCCONSTNR-1];
 
 		/* Link elements into list */
-		for (i = 0; i < ALLOCCONSTNR-1; i++) {
-			c[i].next = &c[i+1];
+		for (i = 0; i < ALLOCCONSTNR - 2; i++) {
+			cpc->data[i].next = &cpc->data[i+1];
 		}
-		c[ALLOCCONSTNR-1].next = NULL;
 	}
 
 	c->type = type;
@@ -173,4 +177,15 @@
 {
 	currConst = firstConst;
 	nConst = 0;
+	while( (poolchunks != NULL) && (poolchunks->next != NULL) )
+	{
+		constpoolchunk *cpc = poolchunks;
+
+		poolchunks = cpc->next;
+		gc_free(poolchunks);
+	}
+	if( poolchunks != NULL )
+	{
+		poolchunks->data[ALLOCCONSTNR - 1].next = NULL;
+	}
 }
Index: kaffe/kaffe/kaffevm/jit3/constpool.h
diff -u kaffe/kaffe/kaffevm/jit3/constpool.h:1.4 kaffe/kaffe/kaffevm/jit3/constpool.h:1.5
--- kaffe/kaffe/kaffevm/jit3/constpool.h:1.4	Mon May 12 21:13:30 2003
+++ kaffe/kaffe/kaffevm/jit3/constpool.h	Tue Sep 16 19:23:38 2003
@@ -69,7 +69,19 @@
 	} val;
 } constpool;
 
-#define ALLOCCONSTNR	32
+#define ALLOCCONSTNR	64
+
+/**
+ * constpools are allocated and tracked as part of a chunk as represented by
+ * this structure.
+ *
+ * next - Link to the next chunk in the list.
+ * data - The constpools contained in the chunk.
+ */
+typedef struct _constpoolchunk {
+	struct _constpoolchunk *next;
+	constpool data[ALLOCCONSTNR];
+} constpoolchunk;
 
 /**
  * These variables track the pool of constpool objects allocated by the jitter.
Index: kaffe/kaffe/kaffevm/jit3/labels.c
diff -u kaffe/kaffe/kaffevm/jit3/labels.c:1.9 kaffe/kaffe/kaffevm/jit3/labels.c:1.10
--- kaffe/kaffe/kaffevm/jit3/labels.c:1.9	Tue Mar 11 08:00:18 2003
+++ kaffe/kaffe/kaffevm/jit3/labels.c	Tue Sep 16 19:23:38 2003
@@ -25,6 +25,7 @@
 #include "thread.h"
 #include "jthread.h"
 
+static labelchunk* labelchunks;
 static label* firstLabel;
 static label* lastLabel;
 static label* currLabel;
@@ -33,7 +34,6 @@
 
 /* Custom edition */
 #define	kprintf	kaffe_dprintf
-#define	gc_calloc_fixed(A,B)	gc_malloc((A)*(B), GC_ALLOC_JITTEMP)
 #include "debug.h"
 
 #if defined(KAFFE_VMDEBUG)
@@ -66,6 +66,17 @@
 resetLabels(void)
 {
 	currLabel = firstLabel;
+	while( (labelchunks != NULL) && (labelchunks->next != NULL) )
+	{
+		labelchunk *lc = labelchunks;
+
+		labelchunks = lc->next;
+		gc_free(labelchunks);
+	}
+	if( labelchunks != NULL )
+	{
+		labelchunks->data[ALLOCLABELNR - 1].next = NULL;
+	}
 }
 
 label *getLastEpilogueLabel(void)
@@ -227,9 +238,17 @@
 
 	ret = currLabel;
 	if (ret == 0) {
+		labelchunk *lc;
+		
 		/* Allocate chunk of label elements */
-		ret = gc_calloc_fixed(ALLOCLABELNR, sizeof(label));
+		lc = gc_malloc(sizeof(labelchunk), GC_ALLOC_JITTEMP);
+		assert(lc != NULL);
+
+		lc->next = labelchunks;
+		labelchunks = lc;
 
+		ret = &lc->data[0];
+		
 		/* Attach to current chain */
 		if (lastLabel == 0) {
 			firstLabel = ret;
@@ -237,16 +256,15 @@
 		else {
 			lastLabel->next = ret;
 		}
-		lastLabel = &ret[ALLOCLABELNR-1];
+		lastLabel = &lc->data[ALLOCLABELNR-1];
 
 		/* Link elements into list */
-		for (i = 0; i < ALLOCLABELNR-1; i++) {
+		for (i = 0; i < ALLOCLABELNR - 2; i++) {
 #if defined(KAFFE_VMDEBUG)
-			sprintf(ret[i].name, "L%d", labelCount + i);
+			sprintf(lc->data[i].name, "L%d", labelCount + i);
 #endif
-			ret[i].next = &ret[i+1];
+			lc->data[i].next = &lc->data[i+1];
 		}
-		ret[ALLOCLABELNR-1].next = 0;
 	}
 	currLabel = ret->next;
 	labelCount += 1;
Index: kaffe/kaffe/kaffevm/jit3/labels.h
diff -u kaffe/kaffe/kaffevm/jit3/labels.h:1.7 kaffe/kaffe/kaffevm/jit3/labels.h:1.8
--- kaffe/kaffe/kaffevm/jit3/labels.h:1.7	Mon May 12 21:13:30 2003
+++ kaffe/kaffe/kaffevm/jit3/labels.h	Tue Sep 16 19:23:38 2003
@@ -113,6 +113,18 @@
 #define	ALLOCLABELNR	1024
 
 /**
+ * Labels are allocated and tracked as part of a chunk as represented by this
+ * structure.
+ *
+ * next - Link to the next chunk in the list.
+ * data - The labels contained in the chunk.
+ */
+typedef struct _labelchunk {
+	struct _labelchunk *next;
+	label data[ALLOCLABELNR];
+} labelchunk;
+
+/**
  * Set the address of all epilogue labels used in this method.
  *
  * Note:  There can be more than one epilogue label because there can be more
Index: kaffe/kaffe/kaffevm/jit3/machine.c
diff -u kaffe/kaffe/kaffevm/jit3/machine.c:1.40 kaffe/kaffe/kaffevm/jit3/machine.c:1.41
--- kaffe/kaffe/kaffevm/jit3/machine.c:1.40	Sat Aug 30 23:57:12 2003
+++ kaffe/kaffe/kaffevm/jit3/machine.c	Tue Sep 16 19:23:38 2003
@@ -374,6 +374,8 @@
 	}
 
 done:;
+	resetLabels();
+	resetConstants();
 	tidyAnalyzeMethod(&codeInfo);
 
 	reinvoke = false;
@@ -719,15 +721,9 @@
 	initSeq();
 	initRegisters();
 	initSlots(stackno);
-	resetLabels();
-	resetConstants();
 
 	/* Before generating code, try to guess how much space we'll need. */
-	if (codeblock_size < codesize)
-		codeblock_size = codesize;
-	if (codeblock_size < ALLOCCODEBLOCKSZ) {
-		codeblock_size = ALLOCCODEBLOCKSZ;
-	}
+	codeblock_size = ALLOCCODEBLOCKSZ;
 	codeblock = gc_malloc(codeblock_size + CODEBLOCKREDZONE, GC_ALLOC_JITTEMP);
 	if (codeblock == 0) {
 		postOutOfMemory(einfo);
@@ -759,11 +755,20 @@
 
 		/* If we overrun the codeblock, reallocate and continue.  */
 		if (CODEPC >= codeblock_size) {
+			nativecode *new_codeblock;
+			
 			codeblock_size += ALLOCCODEBLOCKSZ;
-			codeblock = gc_realloc(codeblock, codeblock_size + CODEBLOCKREDZONE, GC_ALLOC_JITTEMP);
-			if (codeblock == 0) {
+			new_codeblock = gc_realloc(codeblock,
+						   codeblock_size +
+						   CODEBLOCKREDZONE,
+						   GC_ALLOC_JITTEMP);
+			if (new_codeblock == NULL) {
+				gc_free(codeblock);
+				codeblock = NULL;
 				postOutOfMemory(einfo);
 				return (false);
+			} else {
+				codeblock = new_codeblock;
 			}
 		}