PatchSet 7056 Date: 2005/12/26 18:01:44 Author: guilhem Branch: HEAD Tag: (none) Log: Handle OOM in jitter.
* kaffe/kaffevm/jit3/machine.h, kaffe/kaffevm/jit3/machine.c (KaffeJIT3_exitWithOOM, KaffeJIT3_setupExitWithOOM): New functions. (KaffeJIT3_cleanupInsnSequence): New function. (translate): Handle OOM cleanly. * kaffe/kaffevm/jit3/seq.c, kaffe/kaffevm/jit3/labels.c, kaffe/kaffevm/jit3/constpool.c, kaffe/kaffevm/jit3/global-regs.c: Throw an OOM if there is no memory anymore (instead of crashing the VM with an assert). * kaffe/kaffevm/jit/native-wrapper.c (startJNI): Throw an OOM if it is not possible to allocate a new local ref table. (Kaffe_wrapper): Handle OOM cleanly. * kaffe/kaffevm/jit/machine.c (KaffeJIT_exitWithOOM, KaffeJIT_setupExitWithOOM, KaffeJIT_cleanupInsnSequence): New functions. Members: ChangeLog:1.4574->1.4575 kaffe/kaffevm/jit/machine.c:1.83->1.84 kaffe/kaffevm/jit/machine.h:1.24->1.25 kaffe/kaffevm/jit/native-wrapper.c:1.12->1.13 kaffe/kaffevm/jit3/constpool.c:1.16->1.17 kaffe/kaffevm/jit3/global-regs.c:1.1->1.2 kaffe/kaffevm/jit3/labels.c:1.19->1.20 kaffe/kaffevm/jit3/machine.c:1.78->1.79 kaffe/kaffevm/jit3/machine.h:1.27->1.28 kaffe/kaffevm/jit3/seq.c:INITIAL->1.10 Index: kaffe/ChangeLog diff -u kaffe/ChangeLog:1.4574 kaffe/ChangeLog:1.4575 --- kaffe/ChangeLog:1.4574 Mon Dec 26 02:00:14 2005 +++ kaffe/ChangeLog Mon Dec 26 18:01:44 2005 @@ -1,4 +1,30 @@ +2005-12-26 Guilhem Lavaux <[EMAIL PROTECTED]> + + * kaffe/kaffevm/jit3/machine.h, + kaffe/kaffevm/jit3/machine.c + (KaffeJIT3_exitWithOOM, + KaffeJIT3_setupExitWithOOM): New functions. + (KaffeJIT3_cleanupInsnSequence): New function. + (translate): Handle OOM cleanly. + + * kaffe/kaffevm/jit3/seq.c, + kaffe/kaffevm/jit3/labels.c, + kaffe/kaffevm/jit3/constpool.c, + kaffe/kaffevm/jit3/global-regs.c: + Throw an OOM if there is no memory anymore (instead + of crashing the VM with an assert). + + * kaffe/kaffevm/jit/native-wrapper.c + (startJNI): Throw an OOM if it is not possible to allocate + a new local ref table. + (Kaffe_wrapper): Handle OOM cleanly. + + * kaffe/kaffevm/jit/machine.c + (KaffeJIT_exitWithOOM, KaffeJIT_setupExitWithOOM, + KaffeJIT_cleanupInsnSequence): New functions. + 2005-12-26 Riccardo Mottola <[EMAIL PROTECTED]> + * config/config-io.h, config/config-math.h, config/config-mem.h, Index: kaffe/kaffe/kaffevm/jit/machine.c diff -u kaffe/kaffe/kaffevm/jit/machine.c:1.83 kaffe/kaffe/kaffevm/jit/machine.c:1.84 --- kaffe/kaffe/kaffevm/jit/machine.c:1.83 Sat Aug 20 19:20:33 2005 +++ kaffe/kaffe/kaffevm/jit/machine.c Mon Dec 26 18:01:47 2005 @@ -134,6 +134,22 @@ void cancelNoWriteback(void); jlong currentTime(void); +static JTHREAD_JMPBUF JIT_jumpExitWithOOM; + +void KaffeJIT_exitWithOOM() +{ + JTHREAD_LONGJMP(JIT_jumpExitWithOOM, 1); +} + +bool KaffeJIT_setupExitWithOOM(struct _errorInfo* einfo) +{ + if (!JTHREAD_SETJMP(JIT_jumpExitWithOOM)) + return false; + + postOutOfMemory(einfo); + return true; +} + /* * By default, we comply with the Java spec and turn stack overflow checks * on. Note that this involves a noticeable performance penalty. If you @@ -255,6 +271,12 @@ enterTranslator(); startTiming(&jit_time, "jittime"); + if (KaffeJIT_setupExitWithOOM(einfo)) + { + success = false; + goto done2; + } + #if defined(KAFFE_PROFILER) if (profFlag) { static int init = 0; @@ -640,6 +662,13 @@ */ KaffeJIT_newConstant(CPref, meth); return true; +} + +/* + */ +void KaffeJIT_cleanupInsnSequence() +{ + initSeq(); } /* Index: kaffe/kaffe/kaffevm/jit/machine.h diff -u kaffe/kaffe/kaffevm/jit/machine.h:1.24 kaffe/kaffe/kaffevm/jit/machine.h:1.25 --- kaffe/kaffe/kaffevm/jit/machine.h:1.24 Wed Sep 28 02:02:16 2005 +++ kaffe/kaffe/kaffevm/jit/machine.h Mon Dec 26 18:01:47 2005 @@ -167,6 +167,10 @@ bool finishInsnSequence(struct codeinfo*, nativeCodeInfo*, errorInfo*); void installMethodCode(struct codeinfo*, Method*, nativeCodeInfo*); +extern void KaffeJIT_cleanupInsnSequence(); +extern void KaffeJIT_exitWithOOM(); +extern bool KaffeJIT_setupExitWithOOM(errorInfo *einfo); + typedef struct { bool BADARRAYINDEX; bool NULLPOINTER; Index: kaffe/kaffe/kaffevm/jit/native-wrapper.c diff -u kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.12 kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.13 --- kaffe/kaffe/kaffevm/jit/native-wrapper.c:1.12 Tue Jul 19 16:27:36 2005 +++ kaffe/kaffe/kaffevm/jit/native-wrapper.c Mon Dec 26 18:01:47 2005 @@ -36,9 +36,9 @@ threadData *thread_data = THREAD_DATA(); jnirefs* table; - table = gc_malloc - (sizeof(jnirefs) + sizeof(jref)*DEFAULT_JNIREFS_NUMBER, - KGC_ALLOC_STATIC_THREADDATA); + table = checkPtr(gc_malloc + (sizeof(jnirefs) + sizeof(jref)*DEFAULT_JNIREFS_NUMBER, + KGC_ALLOC_STATIC_THREADDATA)); table->prev = thread_data->jnireferences; thread_data->jnireferences = table; @@ -104,6 +104,12 @@ */ enterTranslator(); + if (KJIT(setupExitWithOOM)(&info)) + { + success = false; + goto exitOOM; + } + #if defined(KAFFE_PROFILER) if (profFlag) { profiler_get_clicks(xmeth->jitClicks); @@ -452,6 +458,9 @@ if (use_JNI) xmeth->accflags |= ACC_JNI; + goto done; +exitOOM: + KJIT(cleanupInsnSequence)(); done: KJIT(resetConstants)(); KJIT(resetLabels)(); Index: kaffe/kaffe/kaffevm/jit3/constpool.c diff -u kaffe/kaffe/kaffevm/jit3/constpool.c:1.16 kaffe/kaffe/kaffevm/jit3/constpool.c:1.17 --- kaffe/kaffe/kaffevm/jit3/constpool.c:1.16 Fri Oct 28 15:26:20 2005 +++ kaffe/kaffe/kaffevm/jit3/constpool.c Mon Dec 26 18:01:47 2005 @@ -92,7 +92,8 @@ /* Allocate chunk of constpool elements */ cpc = gc_malloc(sizeof(constpoolchunk), KGC_ALLOC_JIT_CONST); /* XXX Ack! */ - assert(cpc != 0); + if (cpc == NULL) + KaffeJIT3_exitWithOOM(); cpc->next = poolchunks; poolchunks = cpc; Index: kaffe/kaffe/kaffevm/jit3/global-regs.c diff -u kaffe/kaffe/kaffevm/jit3/global-regs.c:1.1 kaffe/kaffe/kaffevm/jit3/global-regs.c:1.2 --- kaffe/kaffe/kaffevm/jit3/global-regs.c:1.1 Wed Aug 10 11:03:18 2005 +++ kaffe/kaffe/kaffevm/jit3/global-regs.c Mon Dec 26 18:01:47 2005 @@ -99,6 +99,9 @@ /* Allocate an array for the slot pointers and copy them in */ slots = gc_malloc((1+maxLocal) * sizeof(SlotInfo*), KGC_ALLOC_JIT_SLOTS); + if (slots == NULL) + KaffeJIT3_exitWithOOM(); + for (j = 0; j < maxLocal; j++) { slots[j] = &localinfo[j]; } Index: kaffe/kaffe/kaffevm/jit3/labels.c diff -u kaffe/kaffe/kaffevm/jit3/labels.c:1.19 kaffe/kaffe/kaffevm/jit3/labels.c:1.20 --- kaffe/kaffe/kaffevm/jit3/labels.c:1.19 Mon May 30 09:24:01 2005 +++ kaffe/kaffe/kaffevm/jit3/labels.c Mon Dec 26 18:01:47 2005 @@ -230,7 +230,8 @@ /* Allocate chunk of label elements */ lc = gc_malloc(sizeof(labelchunk), KGC_ALLOC_JIT_LABELS); - assert(lc != NULL); + if (lc == NULL) + KaffeJIT3_exitWithOOM(); lc->next = labelchunks; labelchunks = lc; Index: kaffe/kaffe/kaffevm/jit3/machine.c diff -u kaffe/kaffe/kaffevm/jit3/machine.c:1.78 kaffe/kaffe/kaffevm/jit3/machine.c:1.79 --- kaffe/kaffe/kaffevm/jit3/machine.c:1.78 Wed Aug 10 11:03:20 2005 +++ kaffe/kaffe/kaffevm/jit3/machine.c Mon Dec 26 18:01:47 2005 @@ -138,6 +138,22 @@ static void printProfilerStats(void); #endif +JTHREAD_JMPBUF JIT3_jumpExitWithOOM; + +void KaffeJIT3_exitWithOOM() +{ + JTHREAD_LONGJMP(JIT3_jumpExitWithOOM, 1); +} + +jboolean KaffeJIT3_setupExitWithOOM(struct _errorInfo* einfo) +{ + if (!JTHREAD_SETJMP(JIT3_jumpExitWithOOM)) + return false; + + postOutOfMemory(einfo); + return true; +} + /* * Translate a method into native code. * @@ -270,6 +286,13 @@ maxArgs += 1; } + + if (KaffeJIT3_setupExitWithOOM(einfo)) + { + success = false; + goto oom_error; + } + DBG(MOREJIT, dprintf("Method: %s.%s%s\n", CLASS_CNAME(xmeth->class), xmeth->name->data, METHOD_SIGD(xmeth)); for (i = 0; i < maxLocal; i++) { @@ -390,7 +413,11 @@ { success = false; } + goto done; +oom_error:; + KaffeJIT3_cleanupInsnSequence(); + done:; KaffeJIT3_resetLabels(); KaffeJIT3_resetConstants(); @@ -449,6 +476,22 @@ return (success); } +void +KaffeJIT3_cleanupInsnSequence() +{ + sequence *s; + + for (s = firstSeq; s != currSeq; s = s->next) + { + if (s->func != doSpill) + continue; + + /* According to doSpill */ + gc_free(s->u[1].smask); + } + initSeq(); +} + /* * Generate the code. */ @@ -578,6 +621,7 @@ strlen(METHOD_SIGD(meth)) + 1, KGC_ALLOC_JITTEMP); + assert(sym != NULL); sprintf(sym, "%s/%s%s", CLASS_CNAME(meth->class), @@ -1069,7 +1113,9 @@ c++; /* Add null slot on the end */ mem = gc_malloc(c * sizeof(SlotData*), KGC_ALLOC_JIT_SLOTS); - + if (mem == NULL) + KaffeJIT3_exitWithOOM(); + i = maxLocal + maxStack + tmpslot; c = 0; for (i--; i >= 0; i--) { @@ -1295,6 +1341,8 @@ fc = KGC_malloc(main_collector, sizeof(fakeCall), KGC_ALLOC_JIT_FAKE_CALL); + if (fc == NULL) + KaffeJIT3_exitWithOOM(); } #if defined(HAVE_branch_and_link) fc->parent = findFakeCall(func); Index: kaffe/kaffe/kaffevm/jit3/machine.h diff -u kaffe/kaffe/kaffevm/jit3/machine.h:1.27 kaffe/kaffe/kaffevm/jit3/machine.h:1.28 --- kaffe/kaffe/kaffevm/jit3/machine.h:1.27 Wed Sep 28 02:02:16 2005 +++ kaffe/kaffe/kaffevm/jit3/machine.h Mon Dec 26 18:01:47 2005 @@ -206,6 +206,9 @@ extern void slotAlias(struct _sequence*); extern void startInsn(struct _sequence*); extern jboolean translate(Method* xmeth, struct _errorInfo* einfo); +extern void KaffeJIT3_exitWithOOM(); +extern jboolean KaffeJIT3_setupExitWithOOM(struct _errorInfo* einfo); +extern void KaffeJIT3_cleanupInsnSequence(); /* * Some global variables used by the translater which we must export. =================================================================== Checking out kaffe/kaffe/kaffevm/jit3/seq.c RCS: /home/cvs/kaffe/kaffe/kaffe/kaffevm/jit3/seq.c,v VERS: 1.10 *************** --- /dev/null Sun Aug 4 19:57:58 2002 +++ kaffe/kaffe/kaffevm/jit3/seq.c Mon Dec 26 18:10:52 2005 @@ -0,0 +1,88 @@ +/* seq.c + * Pseudo instruction sequences. + * + * Copyright (c) 1996, 1997, 2003 + * Transvirtual Technologies, Inc. All rights reserved. + * + * See the file "license.terms" for information on usage and redistribution + * of this file. + */ + +#include "config.h" +#include "config-std.h" +#include "config-mem.h" +#include "gtypes.h" +#include "seq.h" +#include "gc.h" + +static sequencechunk* sequencechunks; +sequence* firstSeq; +sequence* lastSeq; +sequence* currSeq; +sequence* activeSeq; + +/** + * Reset the sequence list. + */ +void +initSeq(void) +{ + currSeq = firstSeq; + while( (sequencechunks != NULL) && (sequencechunks->next != NULL) ) + { + sequencechunk *sc = sequencechunks; + + sequencechunks = sc->next; + gc_free(sc); + } + if( sequencechunks != NULL ) + { + lastSeq = &sequencechunks->data[ALLOCSEQNR - 1]; + lastSeq->next = NULL; + } +} + +/** + * Allocate a new sequence element. + */ +sequence* +nextSeq(void) +{ + sequence* ret; + + ret = currSeq; + if (ret == 0) { + sequencechunk *sc; + + int i; + /* Allocate chunk of sequence elements */ + sc = gc_malloc(sizeof(sequencechunk), KGC_ALLOC_JIT_SEQ); + if (sc == NULL) + KaffeJIT3_exitWithOOM(); + + sc->next = sequencechunks; + sequencechunks = sc; + + ret = &sc->data[0]; + + /* Attach to current chain */ + if (lastSeq == 0) { + firstSeq = ret; + } + else { + lastSeq->next = ret; + } + lastSeq = &sc->data[ALLOCSEQNR-1]; + + /* Link elements into list */ + for (i = 0; i < ALLOCSEQNR-1; i++) { + sc->data[i].next = &sc->data[i+1]; + } + } + currSeq = ret->next; + ret->lastuse = 0; + ret->refed = 1; + ret->jflags = willcatch; + activeSeq = ret; + return (ret); +} _______________________________________________ kaffe mailing list kaffe@kaffe.org http://kaffe.org/cgi-bin/mailman/listinfo/kaffe