From: <pi...@us...> - 2008-07-18 22:57:41
|
Revision: 14743 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14743&view=rev Author: pizlo Date: 2008-07-18 22:57:37 +0000 (Fri, 18 Jul 2008) Log Message: ----------- fixed root scanning bugs and did some changes to the level of debugging Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/TypeReference.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/BaselineConstants.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/StackTrace.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Lock.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -90,7 +90,7 @@ * MULTIPLE GC THREADS WILL PRODUCE SCRAMBLED OUTPUT so only * use these when running with PROCESSORS=1 */ - static final int DEFAULT_VERBOSITY = 0; + static final int DEFAULT_VERBOSITY = 0 /*0*/; static final int FAILURE_VERBOSITY = 3; /*********************************************************************** @@ -156,6 +156,7 @@ /* Registers */ trace.reportDelayedRootEdge(Magic.objectAsAddress(thread).plus(Entrypoints.threadContextRegistersField.getOffset())); + trace.reportDelayedRootEdge(Magic.objectAsAddress(thread).plus(Entrypoints.threadContextRegistersSaveField.getOffset())); trace.reportDelayedRootEdge(Magic.objectAsAddress(thread).plus(Entrypoints.threadExceptionRegistersField.getOffset())); /* Scan the JNI Env field */ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -202,6 +202,7 @@ VM.sysWriteln(ct.getGCOrdinal()," new cr address: ",Magic.objectAsAddress(thread.getContextRegisters())); } + trace.processPrecopyEdge(Magic.objectAsAddress(thread).plus(Entrypoints.threadContextRegistersSaveField.getOffset()), true); trace.processPrecopyEdge(Magic.objectAsAddress(thread).plus(Entrypoints.threadExceptionRegistersField.getOffset()), true); if (thread.getJNIEnv() != null) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -1278,6 +1278,15 @@ } @NoInline + public static void sysWriteln(String s, Atom a) { + swLock(); + write(s); + write(a); + writeln(); + swUnlock(); + } + + @NoInline public static void sysWrite(String s, int i) { swLock(); write(s); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/AnnotatedElement.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -302,6 +302,7 @@ * Return true if this element has a BaselineSaveLSRegisters annotation. * @see org.vmmagic.pragma.BaselineSaveLSRegisters */ + @Uninterruptible public final boolean hasBaselineSaveLSRegistersAnnotation() { return isAnnotationDeclared(TypeReference.BaselineSaveLSRegisters); } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/TypeReference.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/TypeReference.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -168,7 +168,7 @@ public static final TypeReference BaselineNoRegisters = VM.BuildForIA32 ? null : findOrCreate(org.vmmagic.pragma.BaselineNoRegisters.class); public static final TypeReference BaselineSaveLSRegisters = - VM.BuildForIA32 ? null : findOrCreate(org.vmmagic.pragma.BaselineSaveLSRegisters.class); + findOrCreate(org.vmmagic.pragma.BaselineSaveLSRegisters.class); public static final TypeReference Pure = findOrCreate(org.vmmagic.pragma.Pure.class); public static final TypeReference RuntimeFinal = findOrCreate(org.vmmagic.pragma.RuntimeFinal.class); public static final TypeReference NoNullCheck = findOrCreate(org.vmmagic.pragma.NoNullCheck.class); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineCompilerImpl.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -131,6 +131,8 @@ private static int getFirstLocalOffset(NormalMethod method) { if (method.getDeclaringClass().hasBridgeFromNativeAnnotation()) { return STACKFRAME_BODY_OFFSET - (JNICompiler.SAVED_GPRS_FOR_JNI << LG_WORDSIZE); + } else if (method.hasBaselineSaveLSRegistersAnnotation()) { + return STACKFRAME_BODY_OFFSET - (SAVED_GPRS_FOR_SAVE_LS_REGISTERS << LG_WORDSIZE); } else { return STACKFRAME_BODY_OFFSET - (SAVED_GPRS << LG_WORDSIZE); } @@ -3167,8 +3169,8 @@ */ asm.emitPUSH_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset()); // store caller's frame pointer ThreadLocalState.emitMoveRegToField(asm, - ArchEntrypoints.framePointerField.getOffset(), - SP); // establish new frame + ArchEntrypoints.framePointerField.getOffset(), + SP); // establish new frame /* * NOTE: until the end of the prologue SP holds the framepointer. */ @@ -3182,7 +3184,15 @@ asm.emitMOV_RegDisp_Reg(SP, EDI_SAVE_OFFSET, EDI); // save nonvolatile EDI register asm.emitMOV_RegDisp_Reg(SP, EBX_SAVE_OFFSET, EBX); // save nonvolatile EBX register - int savedRegistersSize = SAVED_GPRS << LG_WORDSIZE; // default + int savedRegistersSize; + + if (method.hasBaselineSaveLSRegistersAnnotation()) { + asm.emitMOV_RegDisp_Reg(SP, EBP_SAVE_OFFSET, EBP); + savedRegistersSize = SAVED_GPRS_FOR_SAVE_LS_REGISTERS << LG_WORDSIZE; + } else { + savedRegistersSize= SAVED_GPRS << LG_WORDSIZE; // default + } + /* handle "dynamic brige" methods: * save all registers except FP, SP, TR, S0 (scratch), and * EDI and EBX saved above. @@ -3294,6 +3304,9 @@ asm.emitADD_Reg_Imm(SP, fp2spOffset(NO_SLOT).toInt() - bytesPopped); // SP becomes frame pointer asm.emitMOV_Reg_RegDisp(EDI, SP, EDI_SAVE_OFFSET); // restore nonvolatile EDI register asm.emitMOV_Reg_RegDisp(EBX, SP, EBX_SAVE_OFFSET); // restore nonvolatile EBX register + if (method.hasBaselineSaveLSRegistersAnnotation()) { + asm.emitMOV_Reg_RegDisp(EBP, SP, EBP_SAVE_OFFSET); // restore nonvolatile EBP register + } asm.emitPOP_RegDisp(TR, ArchEntrypoints.framePointerField.getOffset()); // discard frame asm.emitRET_Imm(parameterWords << LG_WORDSIZE); // return to caller- pop parameters from stack } @@ -4731,3 +4744,9 @@ return asm.generatePendingJMP(bTarget); } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -202,6 +202,7 @@ if (!finishedWithRegularMap) { if (counterArrayBase) { counterArrayBase = false; + VM.sysWriteln("Returning EBX"); return registerLocations.get(EBX.value()).toAddress(); } if (mapId < 0) { @@ -237,6 +238,7 @@ VM.sysWrite("Offset is a JSR return address ie internal pointer.\n"); } } + VM.sysWriteln("Returning ",mapIndex); return (framePtr.plus(mapOffset)); } } else { @@ -277,7 +279,8 @@ VM.sysWrite(bridgeRegisterLocation.plus(4)); VM.sysWrite(".\n"); } - + + VM.sysWriteln("Returning some bridge register location"); return bridgeRegisterLocation.plus(4); } @@ -305,6 +308,7 @@ VM.sysWrite(bridgeSpilledParamLocation.plus(4)); VM.sysWrite(".\n"); } + VM.sysWriteln("Returning some bridge spilled param location"); return bridgeSpilledParamLocation.plus(4); } else { break; @@ -328,8 +332,13 @@ } else { // point registerLocations[] to our callers stackframe // + VM.sysWriteln("at method: ",currentMethod.getName()); registerLocations.set(EDI.value(), framePtr.plus(EDI_SAVE_OFFSET).toWord()); registerLocations.set(EBX.value(), framePtr.plus(EBX_SAVE_OFFSET).toWord()); + if (currentMethod.hasBaselineSaveLSRegistersAnnotation()) { + VM.sysWriteln("SETTING EBP REG LOCATION!"); + registerLocations.set(EBP.value(), framePtr.plus(EBP_SAVE_OFFSET).toWord()); + } } return Address.zero(); @@ -408,3 +417,9 @@ private Address bridgeSpilledParamLocation; // current spilled param location private int bridgeSpilledParamInitialOffset;// starting offset to stack location for param0 } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/BaselineConstants.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/BaselineConstants.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/BaselineConstants.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -55,12 +55,19 @@ int BRIDGE_FRAME_EXTRA_SIZE = (SSE2_FULL ? XMM_STATE_SIZE : FPU_STATE_SIZE) + 8; int SAVED_GPRS = 2; // EDI and EBX are nonvolatile registers used by baseline compiler + int SAVED_GPRS_FOR_SAVE_LS_REGISTERS = 3; // save all non-volatiles Offset EDI_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET); Offset EBX_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET).minus(4); + Offset EBP_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_REG_SAVE_OFFSET).minus(8); Offset T0_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_FIRST_PARAMETER_OFFSET); Offset T1_SAVE_OFFSET = Offset.fromIntSignExtend(STACKFRAME_FIRST_PARAMETER_OFFSET).minus(4); Offset FPU_SAVE_OFFSET = T1_SAVE_OFFSET.minus(FPU_STATE_SIZE); Offset XMM_SAVE_OFFSET = T1_SAVE_OFFSET.minus(XMM_STATE_SIZE); - + } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -14,6 +14,8 @@ import org.jikesrvm.runtime.ArchEntrypoints; import org.jikesrvm.runtime.Magic; +import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.VM; import org.jikesrvm.memorymanagers.mminterface.MM_Interface; import org.vmmagic.pragma.NonMoving; import org.vmmagic.pragma.Uninterruptible; @@ -50,6 +52,45 @@ gprs = gprsShadow = MM_Interface.newNonMovingWordArray(NUM_GPRS); fprs = fprsShadow = MM_Interface.newNonMovingDoubleArray(NUM_FPRS); } + + public final void copyFrom(Registers other) { + for (int i=0;i<NUM_GPRS;++i) { + gprs.set(i,other.gprs.get(i)); + } + for (int i=0;i<NUM_FPRS;++i) { + fprs[i]=other.fprs[i]; + } + ip=other.ip; + fp=other.fp; + } + + public final void assertSame(Registers other) { + boolean fail=false; + for (int i=0;i<NUM_GPRS;++i) { + if (gprs.get(i).NE(other.gprs.get(i))) { + VM.sysWriteln("Registers not equal: GPR #",i); + fail=true; + } + } + for (int i=0;i<NUM_FPRS;++i) { + if (fprs[i]!=other.fprs[i]) { + VM.sysWriteln("Registers not equal: FPR #",i); + fail=true; + } + } + if (ip.NE(other.ip)) { + VM.sysWriteln("Registers not equal: IP"); + fail=true; + } + if (fp.NE(other.fp)) { + VM.sysWriteln("Registers not equal: FP"); + fail=true; + } + if (fail) { + RVMThread.dumpStack(); + VM.sysFail("Registers.assertSame() failed"); + } + } /** * Return framepointer for the deepest stackframe @@ -99,3 +140,9 @@ return Magic.objectAsAddress(this).plus(ipOffset); } } + +/* For the emacs weenies in the crowd. +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -244,6 +244,10 @@ getField(org.jikesrvm.scheduler.RVMThread.class, "contextRegisters", org.jikesrvm.ArchitectureSpecific.Registers.class); + public static final RVMField threadContextRegistersSaveField = + getField(org.jikesrvm.scheduler.RVMThread.class, + "contextRegistersSave", + org.jikesrvm.ArchitectureSpecific.Registers.class); public static final RVMField threadExceptionRegistersField = getField(org.jikesrvm.scheduler.RVMThread.class, "exceptionRegisters", Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/StackTrace.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/StackTrace.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/StackTrace.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -28,6 +28,7 @@ import org.jikesrvm.compilers.opt.runtimesupport.OptMachineCodeMap; import org.jikesrvm.scheduler.RVMThread; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.NoInline; import org.vmmagic.unboxed.Address; import org.vmmagic.unboxed.Offset; @@ -95,6 +96,7 @@ * The stack being walked isn't our stack so GC must be disabled. * @return number of stack frames encountered */ + @NoInline private int countFramesNoGC(RVMThread stackTraceThread) { int stackFrameCount = 0; VM.disableGC(); // so fp & ip don't change under our feet @@ -127,6 +129,7 @@ * Walk the stack recording the stack frames encountered. * The stack being walked isn't our stack so GC must be disabled. */ + @NoInline private void recordFramesNoGC(RVMThread stackTraceThread) { int stackFrameCount = 0; VM.disableGC(); // so fp & ip don't change under our feet @@ -165,6 +168,7 @@ * @return number of stack frames encountered */ @Uninterruptible + @NoInline private int countFramesUninterruptible(RVMThread stackTraceThread) { int stackFrameCount = 0; Address fp; @@ -189,7 +193,7 @@ ip = Magic.getReturnAddress(fp); fp = Magic.getCallerFramePointer(fp); } - VM.sysWriteln("stack frame count = ",stackFrameCount); + //VM.sysWriteln("stack frame count = ",stackFrameCount); return stackFrameCount; } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -285,8 +285,11 @@ @NoOptCompile @BaselineSaveLSRegisters public void waitNicely() { - Magic.saveThreadState(RVMThread.getCurrentThread().contextRegisters); + RVMThread t=RVMThread.getCurrentThread(); + Magic.saveThreadState(t.contextRegisters); + t.contextRegistersSave.copyFrom(t.contextRegisters); waitNicelyImpl(); + t.contextRegistersSave.assertSame(t.contextRegisters); } @NoInline Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Lock.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Lock.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Lock.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -121,7 +121,7 @@ */ /** do debug tracing? */ - protected static final boolean trace = true; + protected static final boolean trace = false; /** Control the gathering of statistics */ public static final boolean STATS = false; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-18 07:54:22 UTC (rev 14742) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-18 22:57:37 UTC (rev 14743) @@ -416,6 +416,13 @@ public final Registers contextRegisters; /** + * Place to save register state when this thread is not actually running. + */ + @Entrypoint + @Untraced + public final Registers contextRegistersSave; + + /** * Place to save register state during hardware(C signal trap handler) or * software (RuntimeEntrypoints.athrow) trap handling. */ @@ -1015,8 +1022,9 @@ this.daemon = daemon; this.priority = priority; - contextRegisters = new Registers(); - exceptionRegisters = new Registers(); + contextRegisters = new Registers(); + contextRegistersSave = new Registers(); + exceptionRegisters = new Registers(); if(VM.VerifyAssertions) VM._assert(stack != null); // put self in list of threads known to scheduler and garbage collector @@ -1315,7 +1323,6 @@ @NoInline @NoOptCompile @BaselineSaveLSRegisters - // PNT: make sure we generate GC maps for unint methods final void checkBlock() { Magic.saveThreadState(contextRegisters); checkBlockNoSaveContext(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-19 18:48:28
|
Revision: 14747 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14747&view=rev Author: pizlo Date: 2008-07-19 18:47:56 +0000 (Sat, 19 Jul 2008) Log Message: ----------- fix heisenbug due to mutator registration prior to mutator initiation; mutator registration now happens late Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java 2008-07-19 17:55:12 UTC (rev 14746) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java 2008-07-19 18:47:56 UTC (rev 14747) @@ -89,13 +89,18 @@ */ public void initMutator() { } + + public void registerMutator() { + // don't register the mutator until we're initialized + id = VM.activePlan.registerMutator(this); + } /**************************************************************************** * Instance fields */ /** Unique mutator identifier */ - protected int id = VM.activePlan.registerMutator(this); + protected int id; /** Used for printing log information in a thread safe manner */ protected final Log log = new Log(); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-19 17:55:12 UTC (rev 14746) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-19 18:47:56 UTC (rev 14747) @@ -1032,6 +1032,7 @@ // create primordial thread (in boot image) assignThreadSlot(); initMutator(); + registerMutator(); // Remember the boot thread this.systemThread = true; this.execStatus = IN_JAVA; @@ -1070,6 +1071,7 @@ assignThreadSlot(); initMutator(); + registerMutator(); // only do this at runtime because it will call Magic; // we set this explicitly for the boot thread as part of booting. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-19 22:05:41
|
Revision: 14749 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14749&view=rev Author: pizlo Date: 2008-07-19 22:05:10 +0000 (Sat, 19 Jul 2008) Log Message: ----------- added comments, fixed missing @Uninterruptible, and fixed mutator context limit Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-19 19:37:18 UTC (rev 14748) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-19 22:05:10 UTC (rev 14749) @@ -18,6 +18,7 @@ import org.mmtk.plan.PlanConstraints; import org.jikesrvm.memorymanagers.mminterface.Selected; +import org.jikesrvm.scheduler.RVMThread; import org.vmmagic.pragma.*; @@ -28,7 +29,7 @@ @Uninterruptible public final class ActivePlan extends org.mmtk.vm.ActivePlan { /* Collector and Mutator Context Management */ - private static final int MAX_CONTEXTS = 100; + private static final int MAX_CONTEXTS = RVMThread.MAX_THREADS; private static Selected.Collector[] collectors = new Selected.Collector[MAX_CONTEXTS]; private static int collectorCount = 0; // Number of collector instances private static Selected.Mutator[] mutators = new Selected.Mutator[MAX_CONTEXTS]; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java 2008-07-19 19:37:18 UTC (rev 14748) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/HeavyCondLock.java 2008-07-19 22:05:10 UTC (rev 14749) @@ -14,6 +14,7 @@ import static org.jikesrvm.runtime.SysCall.sysCall; import org.jikesrvm.runtime.Magic; +import org.jikesrvm.VM; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.NonMoving; @@ -287,9 +288,11 @@ public void waitNicely() { RVMThread t=RVMThread.getCurrentThread(); Magic.saveThreadState(t.contextRegisters); - t.contextRegistersSave.copyFrom(t.contextRegisters); + if (VM.VerifyAssertions) t.contextRegistersSave.copyFrom(t.contextRegisters); waitNicelyImpl(); - t.contextRegistersSave.assertSame(t.contextRegisters); + // assert that moving GC didn't modify the context registers, as that would + // indicate that we failed to save that register on the stack. + if (VM.VerifyAssertions) t.contextRegistersSave.assertSame(t.contextRegisters); } @NoInline Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java 2008-07-19 19:37:18 UTC (rev 14748) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java 2008-07-19 22:05:10 UTC (rev 14749) @@ -12,6 +12,8 @@ */ package org.jikesrvm.scheduler; +import org.vmmagic.pragma.Uninterruptible; + /** * An implementation of a latch using the HeavyCondLock in "nice" mode. * This essentially gives you park/unpark functionality. It can also @@ -25,6 +27,7 @@ * ManualResetEvent example: use open() to set, close() to reset, and * wait() to wait. */ +@Uninterruptible public class Latch { private final HeavyCondLock schedLock = new HeavyCondLock(); private boolean open; @@ -70,7 +73,8 @@ /** * Wait for the latch to become open, and then close it and return. - * If the latch is already open, don't wait at all. + * If the latch is already open, don't wait at all, just close it + * immediately and return. */ public void waitAndClose() { schedLock.lockNicely(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-21 03:24:39
|
Revision: 14752 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14752&view=rev Author: pizlo Date: 2008-07-21 03:24:23 +0000 (Mon, 21 Jul 2008) Log Message: ----------- added thoughtful comments about remaining bugs in MMTk+RVM glue Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-20 10:57:49 UTC (rev 14751) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-21 03:24:23 UTC (rev 14752) @@ -157,6 +157,7 @@ * @return The MutatorContext's unique identifier */ @Interruptible + // PNT: FIXME: totally broken? won't we run out of IDs? public synchronized int registerMutator(MutatorContext mutator) { mutators[mutatorCount] = (Selected.Mutator) mutator; return mutatorCount++; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java 2008-07-20 10:57:49 UTC (rev 14751) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java 2008-07-21 03:24:23 UTC (rev 14752) @@ -67,6 +67,8 @@ @Uninterruptible public void startupRendezvous() { + // PNT: FIXME: should not spin GC threads while there are mutator threads that need to do work to stop for GC. + CollectorThread th = Magic.threadAsCollectorThread(RVMThread.getCurrentThread()); int myNumber = th.getGCOrdinal(); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-29 02:24:11
|
Revision: 14818 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14818&view=rev Author: pizlo Date: 2008-07-29 02:24:06 +0000 (Tue, 29 Jul 2008) Log Message: ----------- better MutatorContext handling which causes crashes, and debug code to track said crashes down Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/harness/org/mmtk/harness/vm/ActivePlan.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/harness/src/org/mmtk/harness/Mutator.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/concurrent/ConcurrentCollector.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/semispace/SSMutator.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/vm/ActivePlan.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/harness/org/mmtk/harness/vm/ActivePlan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/harness/org/mmtk/harness/vm/ActivePlan.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/harness/org/mmtk/harness/vm/ActivePlan.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -117,10 +117,9 @@ * Register a new <code>MutatorContext</code> instance. * * @param mutator The <code>MutatorContext</code> to register. - * @return The <code>MutatorContext</code>'s unique identifier */ @Interruptible - public int registerMutator(MutatorContext mutator) { - return Mutator.register(mutator); + public void registerMutator(MutatorContext mutator) { + Mutator.register(mutator); } } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ActivePlan.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -29,11 +29,9 @@ @Uninterruptible public final class ActivePlan extends org.mmtk.vm.ActivePlan { /* Collector and Mutator Context Management */ - private static final int MAX_CONTEXTS = RVMThread.MAX_THREADS; + private static final int MAX_CONTEXTS = 128; // ?? private static Selected.Collector[] collectors = new Selected.Collector[MAX_CONTEXTS]; private static int collectorCount = 0; // Number of collector instances - private static Selected.Mutator[] mutators = new Selected.Mutator[MAX_CONTEXTS]; - private static int mutatorCount = 0; // Number of mutator instances private static SynchronizedCounter mutatorCounter = new SynchronizedCounter(); /** @return The active Plan instance. */ @@ -75,7 +73,7 @@ public CollectorContext collector(int id) { return collectors[id]; } - + /** * Return the MutatorContext instance given its unique identifier. * @@ -84,7 +82,12 @@ */ @Inline public MutatorContext mutator(int id) { - return mutators[id]; + RVMThread t=RVMThread.threadBySlot[id]; + if (t!=null && t.registeredMutator) { + return t; + } else { + return null; + } } /** @@ -105,7 +108,12 @@ */ @Inline public Selected.Mutator selectedMutator(int id) { - return mutators[id]; + RVMThread t=RVMThread.threadBySlot[id]; + if (t!=null && t.registeredMutator) { + return t; + } else { + return null; + } } @@ -117,7 +125,7 @@ /** @return The number of registered MutatorContext instances. */ public int mutatorCount() { - return mutatorCount; + return RVMThread.nextSlot; } /** Reset the mutator iterator */ @@ -134,8 +142,17 @@ * <code>null</code> when all mutators have been done. */ public MutatorContext getNextMutator() { - int id = mutatorCounter.increment(); - return id >= mutatorCount ? null : mutators[id]; + for (;;) { + int idx = mutatorCounter.increment(); + if (idx >= RVMThread.numThreads) { + return null; + } else { + RVMThread t=RVMThread.threads[idx]; + if (t.registeredMutator) { + return t; + } + } + } } /** @@ -156,10 +173,14 @@ * @param mutator The MutatorContext to register * @return The MutatorContext's unique identifier */ - @Interruptible - // PNT: FIXME: totally broken? won't we run out of IDs? - public synchronized int registerMutator(MutatorContext mutator) { - mutators[mutatorCount] = (Selected.Mutator) mutator; - return mutatorCount++; + public void registerMutator(MutatorContext mutator) { + RVMThread t=(RVMThread)mutator; + t.id = t.threadSlot; + t.registeredMutator = true; } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -380,6 +380,7 @@ /* establish the compiled method */ compiledMethod = CompiledMethods.getCompiledMethod(compiledMethodId); + VM.sysWriteln("method id = ",compiledMethodId,", method = ",Magic.objectAsAddress(compiledMethod)); compiledMethod.setActiveOnStack(); // prevents code from being collected compiledMethodType = compiledMethod.getCompilerType(); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/harness/src/org/mmtk/harness/Mutator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/harness/src/org/mmtk/harness/Mutator.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/harness/src/org/mmtk/harness/Mutator.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -87,10 +87,10 @@ /** * Register a mutator, returning the allocated id. */ - public static synchronized int register(MutatorContext context) { + public static synchronized void register(MutatorContext context) { int id = mutators.size(); mutators.add(null); - return id; + context.id=id; } /** Is this thread out of memory if the gc cannot free memory */ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/MutatorContext.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -92,7 +92,7 @@ public void registerMutator() { // don't register the mutator until we're initialized - id = VM.activePlan.registerMutator(this); + VM.activePlan.registerMutator(this); } /**************************************************************************** @@ -100,7 +100,7 @@ */ /** Unique mutator identifier */ - protected int id; + public int id; /** Used for printing log information in a thread safe manner */ protected final Log log = new Log(); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -484,6 +484,11 @@ /* Iterate through all mutator contexts */ MutatorContext mutator; while ((mutator = VM.activePlan.getNextMutator()) != null) { + if (true) { + Log.write("dealing with mutator "); + Log.write(mutator.id); + Log.writeln(); + } mutator.collectionPhase(phaseId, primary); } break; @@ -889,3 +894,8 @@ VM.collection.scheduleConcurrentWorkers(); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -612,9 +612,12 @@ */ public static Space getSpaceFromAllocatorAnyLocal(Allocator a) { for (int i = 0; i < VM.activePlan.mutatorCount(); i++) { - Space space = VM.activePlan.mutator(i).getSpaceFromAllocator(a); - if (space != null) - return space; + MutatorContext mc=VM.activePlan.mutator(i); + if (mc!=null) { + Space space = mc.getSpaceFromAllocator(a); + if (space != null) + return space; + } } return null; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -86,7 +86,15 @@ */ @Inline public /*PNT final*/ void processEdge(ObjectReference source, Address slot) { + Log.write("edge going from "); + Log.flush(); + VM.objectModel.dumpObject(source); + Log.write("at "); + Log.write(slot); + Log.write(" to "); ObjectReference object = VM.activePlan.mutator().loadObjectReference(slot); + Log.write(object); + Log.writeln(); ObjectReference newObject = traceObject(object, false); VM.activePlan.mutator().storeObjectReference(slot, newObject); } @@ -103,6 +111,10 @@ */ @Inline public final void reportDelayedRootEdge(Address slot) { + Log.write("edge going from delayed root "); + Log.write(slot); + Log.write(" to "); + Log.writeln(slot.loadObjectReference()); rootLocations.push(slot); } @@ -117,6 +129,10 @@ */ @Inline public /*PNT final*/ void processRootEdge(Address slot, boolean untraced) { + Log.write("edge going from root "); + Log.write(slot); + Log.write(" to "); + Log.writeln(slot.loadObjectReference()); ObjectReference object; if (untraced) object = slot.loadObjectReference(); else object = VM.activePlan.mutator().loadObjectReference(slot); @@ -271,8 +287,12 @@ return Plan.smallCodeSpace.traceObject(this, object); if (Plan.USE_CODE_SPACE && Space.isInSpace(Plan.LARGE_CODE, object)) return Plan.largeCodeSpace.traceObject(this, object); - if (VM.VERIFY_ASSERTIONS) + if (VM.VERIFY_ASSERTIONS) { + Log.write("Trouble tracing "); + Log.write(object); + Log.writeln(); VM.assertions._assert(false, "No special case for space in traceObject"); + } return ObjectReference.nullReference(); } @@ -530,7 +550,10 @@ private void assertMutatorRemsetsFlushed() { if (VM.VERIFY_ASSERTIONS) { for (int m = 0; m < VM.activePlan.mutatorCount(); m++) { - VM.activePlan.mutator(m).assertRemsetsFlushed(); + MutatorContext mc=VM.activePlan.mutator(m); + if (mc!=null) { + mc.assertRemsetsFlushed(); + } } } } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/concurrent/ConcurrentCollector.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/concurrent/ConcurrentCollector.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/concurrent/ConcurrentCollector.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -15,6 +15,7 @@ import org.mmtk.plan.Phase; import org.mmtk.plan.Plan; import org.mmtk.plan.SimpleCollector; +import org.mmtk.plan.MutatorContext; import org.mmtk.plan.TraceLocal; import org.mmtk.utility.Log; import org.mmtk.utility.options.Options; @@ -87,7 +88,10 @@ if (VM.VERIFY_ASSERTIONS) { VM.assertions._assert(!Plan.gcInProgress()); for(int i=0; i < VM.activePlan.mutatorCount(); i++) { - VM.assertions._assert(((ConcurrentMutator)VM.activePlan.mutator(i)).barrierActive); + MutatorContext mc=VM.activePlan.mutator(i); + if (mc!=null) { + VM.assertions._assert(((ConcurrentMutator)mc).barrierActive); + } } } TraceLocal trace = getCurrentTrace(); @@ -144,3 +148,8 @@ return (Concurrent) VM.activePlan.global(); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/semispace/SSMutator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/semispace/SSMutator.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/semispace/SSMutator.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -16,6 +16,7 @@ import org.mmtk.policy.CopyLocal; import org.mmtk.policy.Space; import org.mmtk.utility.alloc.Allocator; +import org.mmtk.utility.Log; import org.vmmagic.unboxed.*; import org.vmmagic.pragma.*; @@ -158,6 +159,9 @@ if (phaseId == SS.RELEASE) { super.collectionPhase(phaseId, primary); // rebind the allocation bump pointer to the appropriate semispace. + Log.write("rebinding allocator for "); + Log.write(id); + Log.writeln(); ss.rebind(SS.toSpace()); return; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/vm/ActivePlan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/vm/ActivePlan.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/vm/ActivePlan.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -84,8 +84,7 @@ * Register a new <code>MutatorContext</code> instance. * * @param mutator The <code>MutatorContext</code> to register. - * @return The <code>MutatorContext</code>'s unique identifier */ - @Interruptible - public abstract int registerMutator(MutatorContext mutator); + @Uninterruptible + public abstract void registerMutator(MutatorContext mutator); } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -15,6 +15,7 @@ import org.jikesrvm.VM; import org.jikesrvm.scheduler.HeavyCondLock; import org.vmmagic.pragma.Uninterruptible; +import org.vmmagic.pragma.Interruptible; /** * This class implements barrier synchronization. @@ -34,6 +35,7 @@ public Barrier() {} + @Interruptible public void boot(int target) { lock=new HeavyCondLock(); this.target=target; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -390,6 +390,7 @@ } RVMThread.handshakeLock.unlock(); VM.sysWriteln("Thread #",getThreadSlot()," just blocked a bunch of threads."); + RVMThread.dumpAcct(); } /* wait for other collector threads to arrive or be made Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-28 22:04:01 UTC (rev 14817) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-29 02:24:06 UTC (rev 14818) @@ -212,7 +212,7 @@ * and used in {@link Object} lock ownership tests. */ @Entrypoint - private int threadSlot; + public int threadSlot; /** * Thread is a system thread, that is one used by the system and as @@ -718,6 +718,9 @@ /** Number of times dump stack has been called recursively */ protected int inDumpStack = 0; + /** Is this a "registered mutator?" */ + public boolean registeredMutator = false; + /** Lock used for dumping stack and such. */ protected static HeavyCondLock dumpLock; @@ -796,7 +799,7 @@ * When there are no thread slots on the free list, this is the next one * to use. */ - private static int nextSlot = 2; + public static int nextSlot = 2; /** * Number of threads in the system (some of which may not be active). @@ -984,6 +987,7 @@ acctLock.unlock(); } + VM.sysWriteln("Thread #",threadSlot," at ",Magic.objectAsAddress(this)); } /** @@ -1071,7 +1075,9 @@ assignThreadSlot(); initMutator(); + VM.sysWriteln("registering mutator for ",threadSlot); registerMutator(); + VM.sysWriteln("registered mutator for ",threadSlot); // only do this at runtime because it will call Magic; // we set this explicitly for the boot thread as part of booting. @@ -1433,6 +1439,8 @@ // we own the thread for now - it cannot go back to executing Java // code until we release the lock. before we do so we change its // state accordingly and tell anyone who is waiting. + if (VM.VerifyAssertions) VM._assert(newState==BLOCKED_IN_NATIVE || + newState==BLOCKED_IN_JNI); if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," has seen thread #",threadSlot," in native; changing its status accordingly."); ba.clearBlockRequest(this); ba.setBlocked(this,true); @@ -1495,6 +1503,9 @@ public static void leaveNative() { if (!attemptLeaveNativeNoBlock()) { + if (traceReallyBlock) { + VM.sysWriteln("Thread #",getCurrentThreadSlot()," is leaving native blocked"); + } getCurrentThread().checkBlockNoSaveContext(); } } @@ -3223,6 +3234,61 @@ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); } } + + private static void dumpThreadArray(RVMThread[] array,int bound) { + for (int i=0;i<bound;++i) { + if (i!=0) { + VM.sysWrite(", "); + } + VM.sysWrite(i,":"); + RVMThread t=array[i]; + if (t==null) { + VM.sysWrite("none"); + } else { + VM.sysWrite(t.threadSlot,"(",t.execStatus); + if (t.isAboutToTerminate) { + VM.sysWrite("T"); + } + if (t.isBlocking) { + VM.sysWrite("B"); + } + if (t.isJoinable) { + VM.sysWrite("J"); + } + if (t.atYieldpoint) { + VM.sysWrite("Y"); + } + VM.sysWrite(")"); + } + } + } + + private static void dumpThreadArray(String name,RVMThread[] array,int bound) { + VM.sysWrite(name); + VM.sysWrite(": "); + dumpThreadArray(array,bound); + VM.sysWriteln(); + } + + public static void dumpAcct() { + dumpLock.lock(); + acctLock.lock(); + VM.sysWriteln("====== Begin Thread Accounting Dump ======"); + dumpThreadArray("threadBySlot",threadBySlot,nextSlot); + dumpThreadArray("aboutToTerminate",aboutToTerminate,aboutToTerminateN); + VM.sysWrite("freeSlots: "); + for (int i=0;i<freeSlotN;++i) { + if (i!=0) { + VM.sysWrite(", "); + } + VM.sysWrite(i,":",freeSlots[i]); + } + VM.sysWriteln(); + dumpThreadArray("threads",threads,numThreads); + VM.sysWriteln("====== End Thread Accounting Dump ======"); + acctLock.unlock(); + dumpLock.unlock(); + } /** * Dump this thread's identifying information, for debugging, via @@ -3777,7 +3843,9 @@ RVMThread thr = threads[i]; if (thr != null && thr != RVMThread.getCurrentThread() && thr.isAlive()) { thr.dump(); - if (thr.contextRegisters != null) + // PNT: FIXME: this won't work so well since the context registers + // don't tend to have sane values + if (thr.contextRegisters != null && !thr.ignoreHandshakesAndGC()) dumpStack(thr.contextRegisters.getInnermostFramePointer()); } } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-30 03:39:00
|
Revision: 14820 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14820&view=rev Author: pizlo Date: 2008-07-30 03:38:57 +0000 (Wed, 30 Jul 2008) Log Message: ----------- fix eclipse heisenbug Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/JNIEnvironment.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-29 08:21:36 UTC (rev 14819) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-30 03:38:57 UTC (rev 14820) @@ -163,7 +163,6 @@ if (thread.getJNIEnv() != null) { trace.reportDelayedRootEdge(Magic.objectAsAddress(thread).plus(Entrypoints.jniEnvField.getOffset())); trace.reportDelayedRootEdge(Magic.objectAsAddress(thread.getJNIEnv()).plus(Entrypoints.JNIRefsField.getOffset())); - trace.reportDelayedRootEdge(Magic.objectAsAddress(thread.getJNIEnv()).plus(Entrypoints.JNIEnvSavedTRField.getOffset())); trace.reportDelayedRootEdge(Magic.objectAsAddress(thread.getJNIEnv()).plus(Entrypoints.JNIPendingExceptionField.getOffset())); } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-29 08:21:36 UTC (rev 14819) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-30 03:38:57 UTC (rev 14820) @@ -86,15 +86,19 @@ */ @Inline public /*PNT final*/ void processEdge(ObjectReference source, Address slot) { - Log.write("edge going from "); - Log.flush(); - VM.objectModel.dumpObject(source); - Log.write("at "); - Log.write(slot); - Log.write(" to "); + if (false) { + Log.write("edge going from "); + Log.flush(); + VM.objectModel.dumpObject(source); + Log.write("at "); + Log.write(slot); + Log.write(" to "); + } ObjectReference object = VM.activePlan.mutator().loadObjectReference(slot); - Log.write(object); - Log.writeln(); + if (false) { + Log.write(object); + Log.writeln(); + } ObjectReference newObject = traceObject(object, false); VM.activePlan.mutator().storeObjectReference(slot, newObject); } @@ -111,10 +115,12 @@ */ @Inline public final void reportDelayedRootEdge(Address slot) { - Log.write("edge going from delayed root "); - Log.write(slot); - Log.write(" to "); - Log.writeln(slot.loadObjectReference()); + if (false) { + Log.write("edge going from delayed root "); + Log.write(slot); + Log.write(" to "); + Log.writeln(slot.loadObjectReference()); + } rootLocations.push(slot); } @@ -129,10 +135,12 @@ */ @Inline public /*PNT final*/ void processRootEdge(Address slot, boolean untraced) { - Log.write("edge going from root "); - Log.write(slot); - Log.write(" to "); - Log.writeln(slot.loadObjectReference()); + if (false) { + Log.write("edge going from root "); + Log.write(slot); + Log.write(" to "); + Log.writeln(slot.loadObjectReference()); + } ObjectReference object; if (untraced) object = slot.loadObjectReference(); else object = VM.activePlan.mutator().loadObjectReference(slot); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/JNIEnvironment.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-29 08:21:36 UTC (rev 14819) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/JNIEnvironment.java 2008-07-30 03:38:57 UTC (rev 14820) @@ -171,6 +171,8 @@ * @param env the JNIEnvironment to deallocate */ public static synchronized void deallocateEnvironment(JNIEnvironment env) { + env.savedTRreg = null; /* make sure that we don't have a reference back to + the thread, once the thread has died. */ env.next = pool; pool = env; } @@ -351,3 +353,8 @@ } } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-29 08:21:36 UTC (rev 14819) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-30 03:38:57 UTC (rev 14820) @@ -2038,6 +2038,7 @@ // if there was a thread waiting, awaken it if (toAwaken!=null) { + // is this where the problem is coming from? toAwaken.monitor().lockedBroadcast(); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-30 23:04:14
|
Revision: 14822 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14822&view=rev Author: pizlo Date: 2008-07-30 23:04:07 +0000 (Wed, 30 Jul 2008) Log Message: ----------- cleanups, got all collectors except generational to work with new mutator context accounting Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-30 10:06:56 UTC (rev 14821) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-30 23:04:07 UTC (rev 14822) @@ -142,6 +142,11 @@ public static void scanThread(RVMThread thread, TraceLocal trace, boolean processCodeLocations, Address gprs, Address topFrame) { + // figure out if the thread should be scanned at all; if not, exit + if (thread.execStatus==RVMThread.NEW || thread.isAboutToTerminate) { + return; + } + /* establish ip and fp for the stack to be scanned */ Address ip, fp, initialIPLoc; if (topFrame.isZero()) { /* implicit top of stack, inferred from thread */ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java 2008-07-30 10:06:56 UTC (rev 14821) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java 2008-07-30 23:04:07 UTC (rev 14822) @@ -15,6 +15,7 @@ import org.mmtk.plan.*; import org.mmtk.policy.CopyLocal; import org.mmtk.policy.Space; +import org.mmtk.utility.Log; import org.mmtk.utility.deque.*; import org.mmtk.utility.alloc.Allocator; import org.mmtk.utility.statistics.Stats; @@ -243,6 +244,8 @@ * Flush per-mutator remembered sets into the global remset pool. */ public final void flushRememberedSets() { + Log.write("flushing remembered sets for "); + Log.writeln(id); remset.flushLocal(); arrayRemset.flushLocal(); assertRemsetsFlushed(); @@ -257,6 +260,8 @@ */ public final void assertRemsetsFlushed() { if (VM.VERIFY_ASSERTIONS) { + Log.write("asserting remsets flushed for "); + Log.writeln(id); VM.assertions._assert(remset.isFlushed()); VM.assertions._assert(arrayRemset.isFlushed()); } @@ -310,3 +315,8 @@ return (Gen) VM.activePlan.global(); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-30 10:06:56 UTC (rev 14821) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-30 23:04:07 UTC (rev 14822) @@ -369,17 +369,23 @@ for (int i=0;i<numToHandshake;++i) { RVMThread t=RVMThread.handshakeThreads[i]; t.monitor().lock(); - if (t.blockedFor(RVMThread.gcBlockAdapter)) { - // already blocked, remove + if (t.blockedFor(RVMThread.gcBlockAdapter) || + RVMThread.notRunning(t.asyncBlock(RVMThread.gcBlockAdapter))) { + // already blocked or not running, remove RVMThread.handshakeThreads[i--]= RVMThread.handshakeThreads[--numToHandshake]; RVMThread.handshakeThreads[numToHandshake]=null; // help GC - } else { - t.asyncBlock(RVMThread.gcBlockAdapter); } t.monitor().unlock(); } + // quit trying to block threads if all threads are either blocked + // or not running (a thread is "not running" if it is NEW or TERMINATED; + // in the former case it means that the thread has not had start() + // called on it while in the latter case it means that the thread + // is either in the TERMINATED state or is about to be in that state + // real soon now, and will not perform any heap-related stuff before + // terminating). if (numToHandshake==0) break; for (int i=0;i<numToHandshake;++i) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-30 10:06:56 UTC (rev 14821) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-30 23:04:07 UTC (rev 14822) @@ -147,6 +147,10 @@ /** Thread has died. */ public static final int TERMINATED = 7; + public static boolean notRunning(int state) { + return state==NEW || state==TERMINATED; + } + /** * Thread state. Indicates if the thread is running, and if so, what * mode of execution it is using (Java, VM native, or JNI) @@ -158,7 +162,9 @@ * Note that this field is not set atomically with the entering of the * thread onto the aboutToTerminate array - in fact it happens before * that. */ - boolean isAboutToTerminate; + // FIXME: there should be an execStatus state called TERMINATING that + // corresponds to this. that would make a lot more sense. + public boolean isAboutToTerminate; /** Is this thread in the process of blocking? */ boolean isBlocking; @@ -1189,7 +1195,7 @@ && !isAboutToTerminate && (execStatus==IN_JAVA || execStatus==IN_JAVA_TO_BLOCK); } - + /** A variant of checkBlock() that does not save the thread state. */ @NoInline final void checkBlockNoSaveContext() { @@ -1389,65 +1395,83 @@ return newState; } - final void block(BlockAdapter ba,boolean asynchronous) { + /** Attempt to block the thread, and return the state it is in after the + attempt. If we're blocking ourselves, this will always return IN_JAVA. + If the thread signals to us the intention to die as we are trying to + block it, this will return TERMINATED. NOTE: the thread's execStatus + will not actually be TERMINATED at that point yet. */ + final int block(BlockAdapter ba,boolean asynchronous) { + int result; if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is requesting that thread #",threadSlot," blocks."); monitor().lock(); int token=ba.requestBlock(this); if (getCurrentThread()==this) { if (traceBlock) VM.sysWriteln("Thread #",threadSlot," is blocking."); checkBlock(); + result=execStatus; } else { if (traceBlock) VM.sysWriteln("Thread #",threadSlot," is being told to block."); - takeYieldpoint = 1; - // CAS the execStatus field - int newState = setBlockedExecStatus(); - - if (traceReallyBlock) VM.sysWriteln("Thread #",getCurrentThreadSlot()," is blocking thread #",threadSlot," which is in state ",newState); - - // this broadcast serves two purposes: notifies threads that are - // IN_JAVA but waiting on monitor() that they should awake and - // acknowledge the block request; or notifies anyone - // waiting for this thread to block that the thread is - // BLOCKED_IN_NATIVE or BLOCKED_IN_JNI. in the latter case the - // broadcast() happens _before_ the setting of the flags that the - // other threads would be awaiting, but that is fine, since we're - // still holding the lock anyway. - monitor().broadcast(); - - if (newState==IN_JAVA_TO_BLOCK) { - if (!asynchronous) { - if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is waiting for thread #",threadSlot," to block."); - while (ba.hasBlockRequest(this,token) && - !ba.isBlocked(this)) { - if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is calling wait until thread #",threadSlot," blocks."); - if (VM.VerifyAssertions) { - // do a timed wait, and assert that the thread did not disappear - // into native in the meantime - monitor().timedWaitRelative(1000L*1000L*1000L); // 1 sec - if (traceReallyBlock) { - VM.sysWriteln("Thread #",threadSlot,"'s status is ",execStatus); + if (isAboutToTerminate) { + if (traceBlock) VM.sysWriteln("Thread #",threadSlot," is terminating, returning as if blocked in TERMINATED state."); + result=TERMINATED; + } else { + takeYieldpoint = 1; + + // CAS the execStatus field + int newState = setBlockedExecStatus(); + result=newState; + + if (traceReallyBlock) VM.sysWriteln("Thread #",getCurrentThreadSlot()," is blocking thread #",threadSlot," which is in state ",newState); + + // this broadcast serves two purposes: notifies threads that are + // IN_JAVA but waiting on monitor() that they should awake and + // acknowledge the block request; or notifies anyone + // waiting for this thread to block that the thread is + // BLOCKED_IN_NATIVE or BLOCKED_IN_JNI. in the latter case the + // broadcast() happens _before_ the setting of the flags that the + // other threads would be awaiting, but that is fine, since we're + // still holding the lock anyway. + monitor().broadcast(); + + if (newState==IN_JAVA_TO_BLOCK) { + if (!asynchronous) { + if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is waiting for thread #",threadSlot," to block."); + while (ba.hasBlockRequest(this,token) && + !ba.isBlocked(this) && + !isAboutToTerminate) { + if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is calling wait until thread #",threadSlot," blocks."); + // will this deadlock when the thread dies? + if (VM.VerifyAssertions) { + // do a timed wait, and assert that the thread did not disappear + // into native in the meantime + monitor().timedWaitRelative(1000L*1000L*1000L); // 1 sec + if (traceReallyBlock) { + VM.sysWriteln("Thread #",threadSlot,"'s status is ",execStatus); + } + VM._assert(execStatus!=IN_NATIVE); + } else { + monitor().await(); } - VM._assert(execStatus!=IN_NATIVE); - } else { - monitor().await(); + if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," has returned from the wait call."); } - if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," has returned from the wait call."); + if (isAboutToTerminate) { + result=TERMINATED; + } } + } else if (newState==BLOCKED_IN_NATIVE || newState==BLOCKED_IN_JNI) { + // we own the thread for now - it cannot go back to executing Java + // code until we release the lock. before we do so we change its + // state accordingly and tell anyone who is waiting. + if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," has seen thread #",threadSlot," in native; changing its status accordingly."); + ba.clearBlockRequest(this); + ba.setBlocked(this,true); } - } else /* if newState==BLOCKED_IN_NATIVE || newState==BLOCKED_IN_JNI */ { - // we own the thread for now - it cannot go back to executing Java - // code until we release the lock. before we do so we change its - // state accordingly and tell anyone who is waiting. - if (VM.VerifyAssertions) VM._assert(newState==BLOCKED_IN_NATIVE || - newState==BLOCKED_IN_JNI); - if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," has seen thread #",threadSlot," in native; changing its status accordingly."); - ba.clearBlockRequest(this); - ba.setBlocked(this,true); } } monitor().unlock(); if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is done telling thread #",threadSlot," to block."); + return result; } public final boolean blockedFor(BlockAdapter ba) { @@ -1457,12 +1481,12 @@ return result; } - public final void asyncBlock(BlockAdapter ba) { - block(ba,true); + public final int asyncBlock(BlockAdapter ba) { + return block(ba,true); } - public final void block(BlockAdapter ba) { - block(ba,false); + public final int block(BlockAdapter ba) { + return block(ba,false); } public static void enterNative() { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-31 20:59:28
|
Revision: 14827 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14827&view=rev Author: pizlo Date: 2008-07-31 20:59:21 +0000 (Thu, 31 Jul 2008) Log Message: ----------- fix for generational GC, plus some thoughtful comments, and removal of some debug nonsense Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleMutator.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -251,7 +251,6 @@ if (VM.VerifyAssertions) VM._assert(execStatus == RVMThread.IN_JAVA); Address fp = Magic.getFramePointer(); while (true) { - VM.sysWriteln("preparecollector: fp = ",fp); Address caller_ip = Magic.getReturnAddress(fp); Address caller_fp = Magic.getCallerFramePointer(fp); if (Magic.getCallerFramePointer(caller_fp).EQ(ArchitectureSpecific.StackframeLayoutConstants.STACKFRAME_SENTINEL_FP)) @@ -262,7 +261,6 @@ Atom cls = method.getDeclaringClass().getDescriptor(); Atom name = method.getName(); if (name == runAtom && cls == collectorThreadAtom) { - VM.sysWriteln("found ip = ",caller_ip,", fp = ",caller_fp); t.contextRegisters.setInnermost(caller_ip, caller_fp); break; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -384,7 +384,6 @@ /* establish the compiled method */ compiledMethod = CompiledMethods.getCompiledMethod(compiledMethodId); - VM.sysWriteln("method id = ",compiledMethodId,", method = ",Magic.objectAsAddress(compiledMethod)); compiledMethod.setActiveOnStack(); // prevents code from being collected compiledMethodType = compiledMethod.getCompilerType(); @@ -575,9 +574,6 @@ VM._assert(trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getStack()))); VM._assert(thread.getJNIEnv() == null || trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getJNIEnv()))); VM._assert(thread.getJNIEnv() == null || thread.getJNIEnv().refsArray() == null || trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getJNIEnv().refsArray()))); - VM.sysWriteln("thread = ",Magic.objectAsAddress(thread)); - VM.sysWriteln("thread slot = ",thread.getThreadSlot()); - VM.sysWriteln("thread.cr = ",Magic.objectAsAddress(thread.getContextRegisters())); VM._assert(trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getContextRegisters()))); VM._assert(trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getContextRegisters().gprs))); VM._assert(trace.willNotMoveInCurrentCollection(ObjectReference.fromObject(thread.getExceptionRegisters()))); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Scanning.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -38,7 +38,7 @@ * * Class variables */ - private static final boolean TRACE_PRECOPY = true; // DEBUG + private static final boolean TRACE_PRECOPY = false; // DEBUG /** Counter to track index into thread table for root tracing. */ private static final SynchronizedCounter threadCounter = new SynchronizedCounter(); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -484,7 +484,7 @@ /* Iterate through all mutator contexts */ MutatorContext mutator; while ((mutator = VM.activePlan.getNextMutator()) != null) { - if (true) { + if (false) { Log.write("dealing with mutator "); Log.write(mutator.id); Log.writeln(); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -419,8 +419,6 @@ * Set that a collection has been triggered. */ public static void setCollectionTriggered() { - Log.write("SETTING THE COLLECTION AS TRIGGERED!!\n"); - Log.flush(); collectionTriggered = true; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleMutator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleMutator.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleMutator.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -50,6 +50,7 @@ if (!Plan.stacksPrepared()) { VM.collection.prepareMutator(this); } + flushRememberedSets(); return; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/TraceLocal.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -85,7 +85,7 @@ * @param root True if <code>objLoc</code> is within a root. */ @Inline - public /*PNT final*/ void processEdge(ObjectReference source, Address slot) { + public final void processEdge(ObjectReference source, Address slot) { if (false) { Log.write("edge going from "); Log.flush(); @@ -134,7 +134,7 @@ * @param untraced True if <code>objLoc</code> is an untraced root. */ @Inline - public /*PNT final*/ void processRootEdge(Address slot, boolean untraced) { + public final void processRootEdge(Address slot, boolean untraced) { if (false) { Log.write("edge going from root "); Log.write(slot); @@ -158,7 +158,7 @@ * @param slot The location of the interior edge. * @param root True if this is a root edge. */ - public /*PNT final*/ void processInteriorEdge(ObjectReference target, Address slot, boolean root) { + public final void processInteriorEdge(ObjectReference target, Address slot, boolean root) { Address interiorRef = slot.loadAddress(); Offset offset = interiorRef.diff(target.toAddress()); ObjectReference newTarget = traceObject(target, root); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/generational/GenMutator.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -244,8 +244,6 @@ * Flush per-mutator remembered sets into the global remset pool. */ public final void flushRememberedSets() { - Log.write("flushing remembered sets for "); - Log.writeln(id); remset.flushLocal(); arrayRemset.flushLocal(); assertRemsetsFlushed(); @@ -260,8 +258,6 @@ */ public final void assertRemsetsFlushed() { if (VM.VERIFY_ASSERTIONS) { - Log.write("asserting remsets flushed for "); - Log.writeln(id); VM.assertions._assert(remset.isFlushed()); VM.assertions._assert(arrayRemset.isFlushed()); } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -87,18 +87,7 @@ */ public static void insert(Address start, Extent extent, int descriptor, Space space) { - Log.write("adding space "); ObjectReference or=ObjectReference.fromObject(space); - if (or==null) { - Log.writeln("during build"); - } else { - Log.write(or); - Log.write(" from "); - Log.write(start); - Log.write(" to "); - Log.write(start.plus(extent)); - Log.writeln(); - } Extent e = Extent.zero(); while (e.LT(extent)) { int index = hashAddress(start.plus(e)); @@ -185,7 +174,6 @@ * @param lastChunk The last chunk in the linked list of chunks to be freed */ public static void freeAllChunks(Address lastChunk) { - Log.writeln("FREEING! freeAllChunks"); lock.acquire(); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(lastChunk.EQ(Space.chunkAlign(lastChunk, true))); int chunk = hashAddress(lastChunk); @@ -204,7 +192,6 @@ * @return The number of chunks which were contiguously allocated */ public static int freeContiguousChunks(Address start) { - Log.writeln("FREEING! freeContiguousChunks"); lock.acquire(); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(start.EQ(Space.chunkAlign(start, true))); int rtn = freeContiguousChunks(hashAddress(start)); @@ -219,7 +206,6 @@ * @return The number of chunks freed */ private static int freeContiguousChunks(int chunk) { - Log.writeln("FREEING! freeContiguousChunks"); int chunks = regionMap.free(chunk); totalAvailableDiscontiguousChunks += chunks; for (int offset = 0; offset < chunks; offset++) { Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityTraceLocal.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -40,31 +40,6 @@ * Object processing and tracing */ - public void processEdge(ObjectReference source,Address slot) { - Log.write("sanity: from "); - Log.write(source); - Log.write(" to "); - Log.write(slot.loadObjectReference()); - Log.writeln(); - super.processEdge(source,slot); - } - - public void processRootEdge(Address slot, boolean untraced) { - Log.write("sanity: from root to "); - Log.write(slot.loadObjectReference()); - Log.writeln(); - super.processRootEdge(slot,untraced); - } - - public void processInteriorEdge(ObjectReference target,Address slot,boolean root) { - Log.write("sanity: we have a root interior ref to "); - Log.write(target); - Log.write(" that is "); - Log.write(slot.loadAddress()); - Log.writeln(); - super.processInteriorEdge(target,slot,root); - } - /** * This method is the core method during the trace of the object graph. * The role of this method is to: Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineGCMapIterator.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -202,7 +202,6 @@ if (!finishedWithRegularMap) { if (counterArrayBase) { counterArrayBase = false; - VM.sysWriteln("Returning EBX"); return registerLocations.get(EBX.value()).toAddress(); } if (mapId < 0) { @@ -238,7 +237,6 @@ VM.sysWrite("Offset is a JSR return address ie internal pointer.\n"); } } - VM.sysWriteln("Returning ",mapIndex); return (framePtr.plus(mapOffset)); } } else { @@ -280,7 +278,6 @@ VM.sysWrite(".\n"); } - VM.sysWriteln("Returning some bridge register location"); return bridgeRegisterLocation.plus(4); } @@ -308,7 +305,6 @@ VM.sysWrite(bridgeSpilledParamLocation.plus(4)); VM.sysWrite(".\n"); } - VM.sysWriteln("Returning some bridge spilled param location"); return bridgeSpilledParamLocation.plus(4); } else { break; @@ -332,11 +328,9 @@ } else { // point registerLocations[] to our callers stackframe // - VM.sysWriteln("at method: ",currentMethod.getName()); registerLocations.set(EDI.value(), framePtr.plus(EDI_SAVE_OFFSET).toWord()); registerLocations.set(EBX.value(), framePtr.plus(EBX_SAVE_OFFSET).toWord()); if (currentMethod.hasBaselineSaveLSRegistersAnnotation()) { - VM.sysWriteln("SETTING EBP REG LOCATION!"); registerLocations.set(EBP.value(), framePtr.plus(EBP_SAVE_OFFSET).toWord()); } } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -331,8 +331,6 @@ * Handshake.request(). */ handshake.parkCollectorThread(); - VM.sysWriteln("Collector starting!!!!"); - if (verbose >= 2) VM.sysWriteln("GC Message: CT.run waking up"); long startTime = Time.nanoTime(); @@ -348,7 +346,7 @@ /* block all threads. note that some threads will have already blocked themselves (if they had made their own GC requests). */ if (gcOrdinal == GC_ORDINAL_BASE) { - VM.sysWriteln("Thread #",getThreadSlot()," is about to block a bunch of threads."); + if (verbose>=2) VM.sysWriteln("Thread #",getThreadSlot()," is about to block a bunch of threads."); RVMThread.handshakeLock.lock(); // fixpoint until there are no threads that we haven't blocked. // fixpoint is needed in case some thread spawns another thread @@ -389,14 +387,16 @@ if (numToHandshake==0) break; for (int i=0;i<numToHandshake;++i) { - VM.sysWriteln("waiting for ",RVMThread.handshakeThreads[i].getThreadSlot()," to block"); + if (verbose>=2) VM.sysWriteln("waiting for ",RVMThread.handshakeThreads[i].getThreadSlot()," to block"); RVMThread.handshakeThreads[i].block(RVMThread.gcBlockAdapter); RVMThread.handshakeThreads[i]=null; // help GC } } RVMThread.handshakeLock.unlock(); - VM.sysWriteln("Thread #",getThreadSlot()," just blocked a bunch of threads."); - RVMThread.dumpAcct(); + if (verbose>=2) { + VM.sysWriteln("Thread #",getThreadSlot()," just blocked a bunch of threads."); + RVMThread.dumpAcct(); + } } /* wait for other collector threads to arrive or be made @@ -484,15 +484,15 @@ // reset the handshake. this ensures that once threads are awakened, // any new GC requests that they make actually result in GC activity. handshake.reset(); - VM.sysWriteln("Thread #",getThreadSlot()," just reset the handshake."); + if (verbose>=2) VM.sysWriteln("Thread #",getThreadSlot()," just reset the handshake."); Plan.collectionComplete(); - VM.sysWriteln("Marked the collection as complete."); + if (verbose>=2) VM.sysWriteln("Marked the collection as complete."); collectionAttemptBase = 0; - VM.sysWriteln("Thread #",getThreadSlot()," is unblocking a bunch of threads."); + if (verbose>=2) VM.sysWriteln("Thread #",getThreadSlot()," is unblocking a bunch of threads."); // and now unblock all threads RVMThread.handshakeLock.lock(); RVMThread.acctLock.lock(); @@ -512,7 +512,7 @@ RVMThread.handshakeThreads[i]=null; // help GC } RVMThread.handshakeLock.unlock(); - VM.sysWriteln("Thread #",getThreadSlot()," just unblocked a bunch of threads."); + if (verbose>=2) VM.sysWriteln("Thread #",getThreadSlot()," just unblocked a bunch of threads."); /* schedule the FinalizerThread, if there is work to do & it is idle */ Collection.scheduleFinalizerThread(); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -63,9 +63,7 @@ public void waitForGCToFinish() { if (verbose >= 1) VM.sysWriteln("GC Message: Handshake.requestAndAwaitCompletion - yielding"); /* allow a gc thread to run */ - VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," is waiting for the GC to finish."); RVMThread.getCurrentThread().block(RVMThread.gcBlockAdapter); - VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," is done waiting for the GC."); if (verbose >= 1) VM.sysWriteln("GC Message: Handshake.requestAndAwaitCompletion - mutator running"); } @@ -111,12 +109,12 @@ lock.lock(); collectorThreadsParked++; lock.broadcast(); - VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," parked."); + if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," parked."); while (!requestFlag) { - VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," waiting for request."); + if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," waiting for request."); lock.await(); } - VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," got request, unparking."); + if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," got request, unparking."); collectorThreadsParked--; lock.unlock(); } @@ -128,9 +126,9 @@ */ @Uninterruptible private boolean request(int why) { - VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," is trying to make a GC request"); + if (verbose>=1) VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," is trying to make a GC request"); lock.lock(); - VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," acquired the lock for making a GC request"); + if (verbose>=1) VM.sysWriteln("Thread #",RVMThread.getCurrentThreadSlot()," acquired the lock for making a GC request"); if (why > gcTrigger) gcTrigger = why; if (requestFlag) { if (verbose >= 1) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-31 16:02:17 UTC (rev 14826) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-07-31 20:59:21 UTC (rev 14827) @@ -87,9 +87,9 @@ /** Trace thread blockage */ protected static final boolean traceBlock = false; /** Trace when a thread is really blocked */ - protected static final boolean traceReallyBlock = true || traceBlock; + protected static final boolean traceReallyBlock = false || traceBlock; /** Trace thread start/stop */ - protected static final boolean traceAcct = true; + protected static final boolean traceAcct = false; /** Trace execution */ protected static final boolean trace = false; /** Trace thread termination */ @@ -144,7 +144,10 @@ /** like BLOCKED_IN_NATIVE, but indicates that the thread is in JNI rather * than VM native code. */ public static final int BLOCKED_IN_JNI = 6; - /** Thread has died. */ + /** Thread has died. As in, it's no longer executing any Java code and will + * never do so in the future. Once this is set, the GC will no longer mark + * any part of the thread as live; the thread's stack will be deleted. Note + * that this is distinct from the aboutToTerminate state. */ public static final int TERMINATED = 7; public static boolean notRunning(int state) { @@ -161,7 +164,9 @@ /** Is the thread about to terminate? Protected by the thread's monitor. * Note that this field is not set atomically with the entering of the * thread onto the aboutToTerminate array - in fact it happens before - * that. */ + * that. When this field is set to true, the thread's stack will no + * longer be scanned by GC. Note that this is distinct from the TERMINATED + * state. */ // FIXME: there should be an execStatus state called TERMINATING that // corresponds to this. that would make a lot more sense. public boolean isAboutToTerminate; @@ -921,7 +926,20 @@ monitor().lock(); isAboutToTerminate=true; monitor().broadcast(); + flushRequested=true; /* hack! we really want to call + MM_Interface.flushMutatorContext() here, but + handleHandshakeRequest() will already call it + if flushRequested is set. so we do it by + setting flushRequested to true. */ handleHandshakeRequest(); + // WARNING! DANGER! Since we've set isAboutToTerminate to true, when we + // release this lock the GC will: + // 1) No longer scan the thread's stack (though it will *see* the + // thread's stack and mark the stack itself as live, without scanning + // it). + // 2) No longer include the thread in any mutator phases ... hence the + // need to ensure that the mutator context is flushed above. + // 3) No longer attempt to stop the thread. monitor().unlock(); softRendezvous(); @@ -993,7 +1011,9 @@ acctLock.unlock(); } - VM.sysWriteln("Thread #",threadSlot," at ",Magic.objectAsAddress(this)); + if (traceAcct) { + VM.sysWriteln("Thread #",threadSlot," at ",Magic.objectAsAddress(this)); + } } /** @@ -1081,9 +1101,13 @@ assignThreadSlot(); initMutator(); - VM.sysWriteln("registering mutator for ",threadSlot); + if (traceAcct) { + VM.sysWriteln("registering mutator for ",threadSlot); + } registerMutator(); - VM.sysWriteln("registered mutator for ",threadSlot); + if (traceAcct) { + VM.sysWriteln("registered mutator for ",threadSlot); + } // only do this at runtime because it will call Magic; // we set this explicitly for the boot thread as part of booting. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-07-31 21:43:13
|
Revision: 14828 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=14828&view=rev Author: pizlo Date: 2008-07-31 21:43:08 +0000 (Thu, 31 Jul 2008) Log Message: ----------- removed more debug stuff Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/OSR_Listener.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/recompilation/CompilationThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/DynamicLibrary.java rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/OSR_Listener.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/OSR_Listener.java 2008-07-31 20:59:21 UTC (rev 14827) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/OSR_Listener.java 2008-07-31 21:43:08 UTC (rev 14828) @@ -48,8 +48,6 @@ CompiledMethod ypTakenInCM = CompiledMethods.getCompiledMethod(ypTakenInCMID); if (ypTakenInCM.isOutdated() && ypTakenInCM.getCompilerType() == CompiledMethod.BASELINE) { - VM.sysWriteln("doing OSR on backedge!"); - Address tsFromFP = yieldpointServiceMethodFP; Address realFP = Magic.getCallerFramePointer(tsFromFP); @@ -65,8 +63,6 @@ } public static void handleOSRFromOpt(Address yieldpointServiceMethodFP) { - VM.sysWriteln("doing OSR on opt!"); - Address tsFromFP = yieldpointServiceMethodFP; Address realFP = Magic.getCallerFramePointer(tsFromFP); int ypTakenInCMID = Magic.getCompiledMethodID(realFP); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-07-31 20:59:21 UTC (rev 14827) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-07-31 21:43:08 UTC (rev 14828) @@ -154,7 +154,6 @@ if (Controller.options.EARLY_EXIT && Controller.options.EARLY_EXIT_TIME < Controller.controllerClock) { Controller.stop(); } - VM.sysWriteln("processing a controller input event."); Object event = Controller.controllerInputQueue.deleteMin(); ((ControllerInputEvent) event).process(); } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/recompilation/CompilationThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/recompilation/CompilationThread.java 2008-07-31 20:59:21 UTC (rev 14827) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/recompilation/CompilationThread.java 2008-07-31 21:43:08 UTC (rev 14828) @@ -53,10 +53,8 @@ while (true) { Object plan = Controller.compilationQueue.deleteMin(); if (plan instanceof ControllerPlan) { - VM.sysWriteln("doing recompilation!"); ((ControllerPlan) plan).doRecompile(); } else if (plan instanceof OSR_OnStackReplacementPlan) { - VM.sysWriteln("doing OSR!"); ((OSR_OnStackReplacementPlan) plan).execute(); } } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/DynamicLibrary.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/DynamicLibrary.java 2008-07-31 20:59:21 UTC (rev 14827) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/DynamicLibrary.java 2008-07-31 21:43:08 UTC (rev 14828) @@ -98,7 +98,6 @@ // Run any JNI_OnLoad functions defined within the library Address JNI_OnLoadAddress = getSymbol("JNI_OnLoad"); if (!JNI_OnLoadAddress.isZero()) { - VM.sysWriteln("calling onload..."); int version = runJNI_OnLoad(JNI_OnLoadAddress); checkJNIVersion(version); } Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-07-31 20:59:21 UTC (rev 14827) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-07-31 21:43:08 UTC (rev 14828) @@ -1245,7 +1245,6 @@ if (jb==NULL) { jb=&primordial_jb; } - printf("doing longjmp in sysTerminatePthread\n"); longjmp(*jb,1); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-09-21 06:30:15
|
Revision: 15009 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15009&view=rev Author: pizlo Date: 2008-09-21 06:30:09 +0000 (Sun, 21 Sep 2008) Log Message: ----------- fixed sigaltstack bug Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java rvmroot/branches/RVM-PureNativeThread/working/build/components/classpath.xml rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/database/methodsamples/MethodCountData.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/AccumulatingMethodSampleOrganizer.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/RVMMethod.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiler.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/TimerThread.java rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ObjectModel.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -14,6 +14,7 @@ import org.mmtk.utility.alloc.Allocator; +import org.jikesrvm.VM; import org.jikesrvm.runtime.Magic; import org.jikesrvm.objectmodel.JavaHeaderConstants; import org.jikesrvm.objectmodel.TIB; Modified: rvmroot/branches/RVM-PureNativeThread/working/build/components/classpath.xml =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/build/components/classpath.xml 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/build/components/classpath.xml 2008-09-21 06:30:09 UTC (rev 15009) @@ -225,6 +225,7 @@ <arg value="--enable-jni"/> <arg value="--disable-plugin"/> <arg value="--disable-gconf-peer"/> + <arg value="--disable-examples"/> <arg line="${cp.enable.gtk-peer}${cp.enable.portable-native-sync}${cp.disable.alsa}${cp.cppflags}"/> </exec> <exec executable="${make.exe}" failonerror="true" dir="${classpath.dir}"> Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -1588,6 +1588,17 @@ } @NoInline + public static void sysWriteln(String s1, String s2, String s3, Address a) { + swLock(); + write(s1); + write(s2); + write(s3); + write(a); + writeln(); + swUnlock(); + } + + @NoInline public static void sysWrite(int i1, String s, int i2) { swLock(); write(i1); @@ -1724,6 +1735,28 @@ } @NoInline + public static void sysWriteln(String s1, int i, String s2, Word w) { + swLock(); + write(s1); + write(i); + write(s2); + write(w); + writeln(); + swUnlock(); + } + + @NoInline + public static void sysWriteln(String s1, int i, String s2, double d) { + swLock(); + write(s1); + write(i); + write(s2); + write(d); + writeln(); + swUnlock(); + } + + @NoInline public static void sysWriteln(String s1, int i, String s2, Word w, String s3) { swLock(); write(s1); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -23,6 +23,7 @@ import org.jikesrvm.adaptive.measurements.RuntimeMeasurements; import org.jikesrvm.adaptive.measurements.instrumentation.Instrumentation; import org.jikesrvm.adaptive.measurements.organizers.Organizer; +import org.jikesrvm.adaptive.measurements.organizers.AccumulatingMethodSampleOrganizer; import org.jikesrvm.adaptive.recompilation.CompilationThread; import org.jikesrvm.adaptive.recompilation.instrumentation.CounterBasedSampling; import org.jikesrvm.adaptive.util.AOSLogging; @@ -124,7 +125,7 @@ * The main hot method raw data object. */ public static MethodCountData methodSamples; - + /** * The dynamic call graph */ @@ -334,3 +335,9 @@ report(); } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -236,7 +236,8 @@ AOSOptions opts = Controller.options; if (opts.GATHER_PROFILE_DATA) { - Controller.organizers.addElement(new AccumulatingMethodSampleOrganizer()); + Controller.organizers.addElement( + new AccumulatingMethodSampleOrganizer()); createDynamicCallGraphOrganizer(); } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/database/methodsamples/MethodCountData.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/database/methodsamples/MethodCountData.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/database/methodsamples/MethodCountData.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -25,6 +25,7 @@ import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; import org.jikesrvm.compilers.opt.runtimesupport.OptCompiledMethod; +import org.jikesrvm.scheduler.RVMThread; /** * A container for recording how often a method is executed. @@ -113,6 +114,7 @@ * To get a sorted list, pipe the output through sort -n -r. */ public synchronized void report() { + RVMThread.dumpLock.lock(); VM.sysWrite("Method counts: A total of " + totalCountsTaken + " samples\n"); for (int i = 1; i < nextIndex; i++) { double percent = 100 * countsToHotness(counts[i]); @@ -133,6 +135,7 @@ VM.sysWriteln(); } } + RVMThread.dumpLock.unlock(); } /** @@ -490,3 +493,9 @@ } } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/AccumulatingMethodSampleOrganizer.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/AccumulatingMethodSampleOrganizer.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/AccumulatingMethodSampleOrganizer.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -19,7 +19,9 @@ import org.jikesrvm.adaptive.measurements.listeners.MethodListener; import org.jikesrvm.adaptive.util.AOSLogging; import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.scheduler.Latch; import org.vmmagic.pragma.NonMoving; +import org.vmmagic.pragma.Uninterruptible; /** * An organizer for method listener information that @@ -44,6 +46,7 @@ @Override public void initialize() { data = new MethodCountData(); + new AsyncReporter().start(); // PNT: I have a bad feeling about this: int numSamples = Controller.options.METHOD_SAMPLE_SIZE * RVMThread.numProcessors; if (Controller.options.mlCBS()) { @@ -75,4 +78,25 @@ VM.sysWrite("\nMethod sampler report"); if (data != null) data.report(); } + + @NonMoving + class AsyncReporter extends RVMThread { + public AsyncReporter() { + super("Async Profile Reporter"); + makeDaemon(true); + } + + public void run() { + for (;;) { + RVMThread.doProfileReport.waitAndClose(); + report(); + } + } + } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/RVMMethod.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/classloader/RVMMethod.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -662,24 +662,28 @@ RVMClass declaringClass = getDeclaringClass(); if (VM.VerifyAssertions) VM._assert(declaringClass.isResolved()); if (isCompiled()) { - return currentCompiledMethod.getEntryCodeArray(); + CodeArray result=currentCompiledMethod.getEntryCodeArray(); + return result; } else if (!VM.writingBootImage || isNative()) { if (!isStatic() && !isObjectInitializer() && !isPrivate()) { // A non-private virtual method. if (declaringClass.isJavaLangObjectType() || declaringClass.getSuperClass().findVirtualMethod(getName(), getDescriptor()) == null) { // The root method of a virtual method family can use the lazy method invoker directly. - return Entrypoints.lazyMethodInvokerMethod.getCurrentEntryCodeArray(); + CodeArray result=Entrypoints.lazyMethodInvokerMethod.getCurrentEntryCodeArray(); + return result; } else { // All other virtual methods in the family must use unique stubs to // ensure correct operation of the method test (guarded inlining of virtual calls). // It is TIBs job to marshall between the actual trampoline and this marker. - return LazyCompilationTrampoline.instructions; + CodeArray result=LazyCompilationTrampoline.instructions; + return result; } } else { // We'll never do a method test against this method. // Therefore we can use the lazy method invoker directly. - return Entrypoints.lazyMethodInvokerMethod.getCurrentEntryCodeArray(); + CodeArray result=Entrypoints.lazyMethodInvokerMethod.getCurrentEntryCodeArray(); + return result; } } else { compile(); @@ -822,3 +826,9 @@ return result; } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiler.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiler.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/BaselineCompiler.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -17,6 +17,7 @@ import org.jikesrvm.ArchitectureSpecific.BaselineCompilerImpl; import org.jikesrvm.ArchitectureSpecific.MachineCode; import org.jikesrvm.VM; +import org.jikesrvm.runtime.Magic; import org.jikesrvm.classloader.NormalMethod; import org.jikesrvm.compilers.common.CompiledMethod; import org.jikesrvm.compilers.common.CompiledMethods; @@ -316,3 +317,8 @@ return "baseline"; } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/baseline/ia32/BaselineExceptionDeliverer.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -67,6 +67,7 @@ // the stacklimit should be harmless, since the stacklimit should already have exactly // the value we are setting it too. myThread.stackLimit = Magic.objectAsAddress(myThread.getStack()).plus(STACK_SIZE_GUARD); + Magic.restoreHardwareExceptionState(registers); if (VM.VerifyAssertions) VM._assert(NOT_REACHED); } @@ -99,9 +100,17 @@ if (VM.VerifyAssertions) VM._assert(SAVED_GPRS == 2); registers.gprs.set(EDI.value(), fp.plus(EDI_SAVE_OFFSET).loadWord()); registers.gprs.set(EBX.value(), fp.plus(EBX_SAVE_OFFSET).loadWord()); + if (method.hasBaselineSaveLSRegistersAnnotation()) { + registers.gprs.set(EBP.value(), fp.plus(EBP_SAVE_OFFSET).toWord()); + } registers.unwindStackFrame(); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/Registers.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -139,6 +139,17 @@ Offset ipOffset = ArchEntrypoints.registersIPField.getOffset(); return Magic.objectAsAddress(this).plus(ipOffset); } + + public final void dump() { + for (int i=0;i<NUM_GPRS;++i) { + VM.sysWriteln("gprs[",i,"] = ",gprs.get(i)); + } + for (int i=0;i<NUM_FPRS;++i) { + VM.sysWriteln("fprs[",i,"] = ",fprs[i]); + } + VM.sysWriteln("ip = ",ip); + VM.sysWriteln("fp = ",fp); + } } /* For the emacs weenies in the crowd. Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Handshake.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -59,6 +59,13 @@ lock = new HeavyCondLock(); } + /** + * Call this if you know that a GC request has already been made and you'd like + * to wait on that GC to finish - presumably because you're trying to allocate + * and cannot reasonably do so before GC is done. Note, there CANNOT be a + * GC safe point between when you realize that there is already a GC request and + * when you call this method! + */ @Uninterruptible public void waitForGCToFinish() { if (verbose >= 1) VM.sysWriteln("GC Message: Handshake.requestAndAwaitCompletion - yielding"); @@ -112,7 +119,7 @@ if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," parked."); while (!requestFlag) { if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," waiting for request."); - lock.await(); + lock.waitNicely(); } if (verbose>=1) VM.sysWriteln("GC Thread #",RVMThread.getCurrentThreadSlot()," got request, unparking."); collectorThreadsParked--; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/objectmodel/JavaHeader.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -893,3 +893,8 @@ Configuration.archHelper.baselineEmitLoadTIB(asm, dest, object, TIB_OFFSET); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -711,7 +711,7 @@ */ @Entrypoint static void deliverHardwareException(int trapCode, int trapInfo) { - + RVMThread myThread = RVMThread.getCurrentThread(); Registers exceptionRegisters = myThread.getExceptionRegisters(); @@ -1179,3 +1179,8 @@ return VM.ForceFrequentGC && RVMThread.safeToForceGCs(); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/Latch.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -50,6 +50,18 @@ } /** + * Like open(), but does it without letting the system know that we + * could potentially block. This is faster, and better for use in + * interrupt handlers. + */ + public void openDangerously() { + schedLock.lockNicely(); + open=true; + schedLock.broadcast(); + schedLock.unlock(); + } + + /** * Close the latch, causing future calls to wait() or waitAndClose() * to block. */ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -106,12 +106,15 @@ static int notifyOperations; /** Number of notifyAll operations */ static int notifyAllOperations; + + public static final boolean ALWAYS_LOCK_ON_STATE_TRANSITION = false; /* * definitions for thread status for interaction of Java-native transitions * and requests for threads to stop. */ - /** thread has not yet started */ + /** thread has not yet started. this state holds right up until just before + * we call pthread_create(). */ public static final int NEW = 0; /** thread is in Java code */ public static final int IN_JAVA = 1; @@ -250,6 +253,9 @@ private long yieldpointsTaken; private long yieldpointsTakenFully; + + private long nativeEnteredBlocked; + private long jniEnteredBlocked; /** * Assertion checking while manipulating raw addresses -- @@ -725,6 +731,13 @@ * See also: RunBootImage.C */ public static volatile boolean debugRequested; + + public volatile boolean asyncDebugRequestedForThisThread; + + /** + * The latch for reporting profile data. + */ + public static Latch doProfileReport; /** Number of times dump stack has been called recursively */ protected int inDumpStack = 0; @@ -733,7 +746,7 @@ public boolean registeredMutator = false; /** Lock used for dumping stack and such. */ - protected static HeavyCondLock dumpLock; + public static HeavyCondLock dumpLock; /** In dump stack and dying */ protected static boolean exitInProgress = false; @@ -782,6 +795,11 @@ public static NoYieldpointsCondLock acctLock; /** + * Lock (mutex) used for servicing debug requests. + */ + public static NoYieldpointsCondLock debugLock; + + /** * Lock used for generating debug output. */ private static NoYieldpointsCondLock outputLock; @@ -836,6 +854,11 @@ public static RVMThread[] handshakeThreads = new RVMThread[MAX_THREADS]; /** + * Preallocated array for use in debug requested. Protected by debugLock. + */ + public static RVMThread[] debugThreads = new RVMThread[MAX_THREADS]; + + /** * Number of active threads in the system. */ private static int numActiveThreads; @@ -880,9 +903,11 @@ public static void boot() { dumpLock=new HeavyCondLock(); acctLock=new NoYieldpointsCondLock(); + debugLock=new NoYieldpointsCondLock(); outputLock=new NoYieldpointsCondLock(); softHandshakeDataLock=new HeavyCondLock(); handshakeLock=new HeavyCondLock(); + doProfileReport=new Latch(false); monitorBySlot[getCurrentThread().threadSlot] = new NoYieldpointsCondLock(); @@ -939,7 +964,7 @@ // it). // 2) No longer include the thread in any mutator phases ... hence the // need to ensure that the mutator context is flushed above. - // 3) No longer attempt to stop the thread. + // 3) No longer attempt to block the thread. monitor().unlock(); softRendezvous(); @@ -1055,7 +1080,7 @@ contextRegisters = new Registers(); contextRegistersSave = new Registers(); exceptionRegisters = new Registers(); - + if(VM.VerifyAssertions) VM._assert(stack != null); // put self in list of threads known to scheduler and garbage collector if (!VM.runningVM) { @@ -1203,13 +1228,15 @@ * Java code if its <code>execStatus</code> is <code>IN_JAVA</code> or * <code>IN_JAVA_TO_BLOCK</code>, and if it is not * <code>aboutToTerminate</code>, and if it is not blocked. Only call - * this method when already holding the monitor(), for two reasons: + * this method when already holding the monitor(), and probably only after + * calling setBlockedExecStatus(), for two reasons: * <ol> * <li>This method does not acquire the monitor() lock even though it needs * to have it acquired given the data structures that it is accessing. * <li>You will typically want to call this method to decide if you need * to take action under the assumption that the thread is running Java - * (or not running Java). So long as you hold the lock the thread + * (or not running Java). So long as you hold the lock - and you have + * called setBlockedExecStatus() - the thread * cannot change state from running-Java to not-running-Java. * </ol> * @return if the thread is running Java @@ -1374,8 +1401,10 @@ boolean commitSoftRendezvous; monitor().lock(); if (jni) { + jniEnteredBlocked++; execStatus=BLOCKED_IN_JNI; } else { + nativeEnteredBlocked++; execStatus=BLOCKED_IN_NATIVE; } acknowledgeBlockRequests(); @@ -1515,23 +1544,28 @@ public static void enterNative() { RVMThread t=getCurrentThread(); - Offset offset=Entrypoints.execStatusField.getOffset(); - int oldState,newState; - do { - oldState=Magic.prepareInt(t,offset); - if (oldState==IN_JAVA) { - newState=IN_NATIVE; - } else if (oldState==IN_JAVA_TO_BLOCK) { - t.enterNativeBlocked(); - return; - } else { - VM._assert(false); - return; // make javac happy - } - } while (!(Magic.attemptInt(t,offset,oldState,newState))); + if (ALWAYS_LOCK_ON_STATE_TRANSITION) { + t.enterNativeBlocked(); + } else { + Offset offset=Entrypoints.execStatusField.getOffset(); + int oldState,newState; + do { + oldState=Magic.prepareInt(t,offset); + if (oldState==IN_JAVA) { + newState=IN_NATIVE; + } else if (oldState==IN_JAVA_TO_BLOCK) { + t.enterNativeBlocked(); + return; + } else { + VM._assert(false); + return; // make javac happy + } + } while (!(Magic.attemptInt(t,offset,oldState,newState))); + } } public static boolean attemptLeaveNativeNoBlock() { + if (ALWAYS_LOCK_ON_STATE_TRANSITION) return false; RVMThread t=getCurrentThread(); Offset offset=Entrypoints.execStatusField.getOffset(); int oldState,newState; @@ -1568,6 +1602,61 @@ if (traceBlock) VM.sysWriteln("Thread #",getCurrentThread().threadSlot," is done requesting that thread #",threadSlot," unblocks."); } + private final void handleDebugRequestForThread() { + monitor().lock(); + dumpLock.lock(); + extDump(); + if (!isAboutToTerminate) { + setBlockedExecStatus(); + if (isInJava()) { + asyncDebugRequestedForThisThread=true; + takeYieldpoint=1; + VM.sysWriteln("(stack trace will follow if thread is not lost...)"); + } else { + if (contextRegisters!=null) { + dumpStack(contextRegisters.getInnermostFramePointer()); + } else { + VM.sysWriteln("(cannot dump stack trace; thread is not running in Java but has no contextRegisters)"); + } + } + } + dumpLock.unlock(); + monitor().unlock(); + } + + @NoCheckStore + public static final void checkDebugRequest() { + if (debugRequested) { + debugLock.lock(); + if (debugRequested) { + debugRequested=false; + + VM.sysWriteln("=== Debug requested - attempting safe VM dump ==="); + + dumpAcct(); + + VM.sysWriteln("Timer ticks = ",timerTicks); + + doProfileReport.open(); + + // snapshot the threads + acctLock.lock(); + int numDebugThreads=numThreads; + for (int i=0;i<numThreads;++i) { + debugThreads[i]=threads[i]; + } + acctLock.unlock(); + + // do the magic + for (int i=0;i<numDebugThreads;++i) { + debugThreads[i].handleDebugRequestForThread(); + debugThreads[i]=null; + } + } + debugLock.unlock(); + } + } + /** Are we allowed to take yieldpoints? */ @Inline public boolean yieldpointsEnabled() { @@ -1758,8 +1847,10 @@ * Start execution of 'this' by putting it on the appropriate queue * of an unspecified virtual processor. */ - @Interruptible + @Interruptible // ??? public final void start() { + // N.B.: cannot hit a yieldpoint between setting execStatus and starting the + // thread!! this.execStatus = IN_JAVA; acctLock.lock(); numActiveThreads++; @@ -1933,6 +2024,7 @@ @BaselineSaveLSRegisters //Save all non-volatile registers in prologue @NoOptCompile + @NoInline //We should also have a pragma that saves all non-volatiles in opt compiler, // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement //todo fix this -- related to SaveVolatile @@ -1948,6 +2040,7 @@ @BaselineSaveLSRegisters //Save all non-volatile registers in prologue @NoOptCompile + @NoInline // We should also have a pragma that saves all non-volatiles in opt compiler, // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement // TODO fix this -- related to SaveVolatile @@ -1963,6 +2056,7 @@ @BaselineSaveLSRegisters //Save all non-volatile registers in prologue @NoOptCompile + @NoInline //We should also have a pragma that saves all non-volatiles in opt compiler, // OSR_BaselineExecStateExtractor.java, should then restore all non-volatiles before stack replacement // TODO fix this -- related to SaveVolatile @@ -2485,9 +2579,21 @@ Magic.isync(); } + // process memory management requests if (flushRequested) { MM_Interface.flushMutatorContext(); } + + // not really a "soft handshake" request but we handle it here anyway + if (asyncDebugRequestedForThisThread) { + asyncDebugRequestedForThisThread=false; + dumpLock.lock(); + VM.sysWriteln("Handling async stack trace request..."); + dump(); + VM.sysWriteln(); + dumpStack(); + dumpLock.unlock(); + } } /** @@ -3316,8 +3422,8 @@ } public static void dumpAcct() { + acctLock.lock(); dumpLock.lock(); - acctLock.lock(); VM.sysWriteln("====== Begin Thread Accounting Dump ======"); dumpThreadArray("threadBySlot",threadBySlot,nextSlot); dumpThreadArray("aboutToTerminate",aboutToTerminate,aboutToTerminateN); @@ -3331,10 +3437,20 @@ VM.sysWriteln(); dumpThreadArray("threads",threads,numThreads); VM.sysWriteln("====== End Thread Accounting Dump ======"); + dumpLock.unlock(); acctLock.unlock(); - dumpLock.unlock(); } + public void extDump() { + dump(); + VM.sysWriteln(); + VM.sysWriteln("acquireCount for my monitor: ",monitor().acquireCount); + VM.sysWriteln("yieldpoints taken: ",yieldpointsTaken); + VM.sysWriteln("yieldpoints taken fully: ",yieldpointsTakenFully); + VM.sysWriteln("native entered blocked: ",nativeEnteredBlocked); + VM.sysWriteln("JNI entered blocked: ",jniEnteredBlocked); + } + /** * Dump this thread's identifying information, for debugging, via * {@link VM#sysWrite(String)}. @@ -3429,6 +3545,9 @@ if (hasInterrupt || asyncThrowable!=null) { offset = Services.sprintf(dest, offset, "-interrupted"); } + if (isAboutToTerminate) { + offset = Services.sprintf(dest, offset, "-terminating"); + } return offset; } @@ -3603,7 +3722,7 @@ @LogicallyUninterruptible public static void dumpStack() { if (VM.runningVM) { - VM.sysWriteln("Dumping stack for Thread #",getCurrentThreadSlot(),"\n"); + VM.sysWriteln("Dumping stack for Thread #",getCurrentThreadSlot()); dumpStack(Magic.getFramePointer()); } else { StackTraceElement[] elements = @@ -3651,7 +3770,6 @@ if (VM.VerifyAssertions) VM._assert(VM.NOT_REACHED); } - VM.sysWriteln(); if (!isAddressValidFramePointer(fp)) { VM.sysWrite("Bogus looking frame pointer: ", fp); VM.sysWriteln(" not dumping stack"); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/TimerThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/TimerThread.java 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/TimerThread.java 2008-09-21 06:30:09 UTC (rev 15009) @@ -65,6 +65,7 @@ candidate.takeYieldpoint=1; } } + RVMThread.checkDebugRequest(); } } catch (Throwable e) { printExceptionAndDie(e); Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-21 06:30:09 UTC (rev 15009) @@ -406,22 +406,22 @@ #endif // RVM_WITH_ALIGNMENT_CHECKING -void +extern "C" void hardwareTrapHandler(int signo, siginfo_t *si, void *context) { // alignment checking: handle hardware alignment exceptions - #ifdef RVM_WITH_ALIGNMENT_CHECKING +#ifdef RVM_WITH_ALIGNMENT_CHECKING if (signo == SIGBUS || alignCheckHandlerJumpLocation) { int returnNow = handleAlignmentTrap(signo, context); if (returnNow) { return; } } - #endif // RVM_WITH_ALIGNMENT_CHECKING - +#endif // RVM_WITH_ALIGNMENT_CHECKING + unsigned int localInstructionAddress; static pthread_mutex_t exceptionLock = PTHREAD_MUTEX_INITIALIZER; - + /* * Get the exceptionLock. We can not call pthread_mutex_lock, * it might block and we could catch another signal @@ -437,7 +437,7 @@ // We should never get here. _exit(EXIT_STATUS_DYING_WITH_UNCAUGHT_EXCEPTION); } - + unsigned int localNativeThreadAddress; unsigned int localFrameAddress; unsigned int localJTOC = VmToc; @@ -925,7 +925,6 @@ *roundedImageSize = pageRoundUp(actualImageSize); fseek (fin, 0L, SEEK_SET); - void *bootRegion = 0; bootRegion = mmap((void*)targetAddress, *roundedImageSize, PROT_READ | PROT_WRITE | PROT_EXEC, @@ -1103,7 +1102,7 @@ struct sigaction action; memset (&action, 0, sizeof action); - action.sa_sigaction = &hardwareTrapHandler; + action.sa_sigaction = hardwareTrapHandler; /* * mask all signal from reaching the signal handler while the signal * handler is running Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-19 12:38:54 UTC (rev 15008) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-21 06:30:09 UTC (rev 15009) @@ -116,7 +116,8 @@ // static int TimerDelay = 10; // timer tick interval, in milliseconds (10 <= delay <= 999) // static int SelectDelay = 2; // pause time for select(), in milliseconds (0 <= delay <= 999) -static void *sysNativeThreadStartup(void *args); +extern "C" void *sysNativeThreadStartup(void *args); +extern "C" void hardwareTrapHandler(int signo, siginfo_t *si, void *context); /* This routine is not yet used by all of the functions that return strings in * buffers, but I hope that it will be one day. */ @@ -886,9 +887,21 @@ // keys for managing thread termination static pthread_key_t TerminateJmpBufKey; -static void * +extern "C" void * sysNativeThreadStartup(void *args) { + /* install a stack for hardwareTrapHandler() to run on */ + stack_t stack; + + memset (&stack, 0, sizeof stack); + stack.ss_sp = new char[SIGSTKSZ]; + + stack.ss_size = SIGSTKSZ; + if (sigaltstack (&stack, 0)) { + fprintf(stderr,"sigaltstack failed (errno=%d)\n",errno); + exit(1); + } + Address tr = ((Address *)args)[0]; jmp_buf *jb = (jmp_buf*)malloc(sizeof(jmp_buf)); @@ -1611,7 +1624,8 @@ int protection , int flags , int fd , Offset offset) { - return mmap(start, (size_t)(length), protection, flags, fd, (off_t)offset); + void *result=mmap(start, (size_t)(length), protection, flags, fd, (off_t)offset); + return result; } // Same as mmap, but with more debugging support. This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-09-29 03:06:51
|
Revision: 15024 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15024&view=rev Author: pizlo Date: 2008-09-29 03:06:44 +0000 (Mon, 29 Sep 2008) Log Message: ----------- fixed ConcMS deadlock, and uncovered a ConcMS crash bug Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/SysCall.java rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/VM.java 2008-09-29 03:06:44 UTC (rev 15024) @@ -2544,3 +2544,9 @@ } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethods.java 2008-09-29 03:06:44 UTC (rev 15024) @@ -100,7 +100,8 @@ if (VM.VerifyAssertions) { if (!(0 < compiledMethodId && compiledMethodId <= currentCompiledMethodId)) { VM.sysWriteln("WARNING: attempt to get compiled method #", compiledMethodId); - return null; + VM.sysFail("attempt to get an invalid compiled method ID"); + return null; } } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-09-29 03:06:44 UTC (rev 15024) @@ -42,20 +42,24 @@ countIdx=0; } - public void arrive() { + public boolean arrive() { lock.lock(); int myCountIdx=countIdx; + boolean result; counters[myCountIdx]++; if (counters[myCountIdx]==target) { counters[myCountIdx]=0; countIdx^=1; lock.broadcast(); + result=true; } else { while (counters[myCountIdx]!=0) { lock.await(); } + result=false; } lock.unlock(); + return result; } } /* Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java 2008-09-29 03:06:44 UTC (rev 15024) @@ -38,10 +38,12 @@ * java.lang.Thread. */ private static final String myName = "ConcurrentCollectorThread"; + private static Barrier barrier = new Barrier(); + private static HeavyCondLock schedLock; private static boolean triggerRun; - private static int maxRunning = RVMThread.numProcessors; + private static int maxRunning; private static int running; /*********************************************************************** @@ -76,6 +78,8 @@ } public static void boot() { + maxRunning=RVMThread.numProcessors; + barrier.boot(maxRunning); schedLock = new HeavyCondLock(); } @@ -91,6 +95,11 @@ @Interruptible public static ConcurrentCollectorThread createConcurrentCollectorThread() { byte[] stack = MM_Interface.newStack(ArchitectureSpecific.StackframeLayoutConstants.STACK_SIZE_COLLECTOR, true); + + schedLock.lock(); + running++; + schedLock.unlock(); + return new ConcurrentCollectorThread(stack); } @@ -124,14 +133,14 @@ schedLock.waitNicely(); } running++; - if (running==maxRunning) { + schedLock.unlock(); + + if (barrier.arrive()) { + schedLock.lock(); + triggerRun=false; schedLock.broadcast(); + schedLock.unlock(); } - // wait for the trigger to reset - while (triggerRun) { - schedLock.waitNicely(); - } - schedLock.unlock(); if (verbose >= 1) VM.sysWriteln("GC Message: Concurrent collector awake"); Selected.Collector.get().concurrentCollect(); @@ -142,20 +151,25 @@ @Uninterruptible public static void scheduleConcurrentCollectorThreads() { schedLock.lock(); - // wait for previous concurrent collection cycle to finish - while (running!=0) { - schedLock.waitNicely(); + if (true) { + // this code is what is needed to make it work + // but this is dangerous ... do we know that the concurrent workers will go into + // quiescence before this is called? + if (!triggerRun && running==0) { + // now start a new cycle + triggerRun=true; + schedLock.broadcast(); + } + } else { + // this is the code I'd much rather be using + // wait for previous concurrent collection cycle to finish + while (triggerRun || running!=0) { + schedLock.waitNicely(); + } + // now start a new cycle + triggerRun=true; + schedLock.broadcast(); } - // now start a new cycle - triggerRun=true; - schedLock.broadcast(); - // wait for all of them to start running - while (running<maxRunning) { - schedLock.waitNicely(); - } - // reset the trigger - triggerRun=false; - schedLock.broadcast(); schedLock.unlock(); } @@ -171,3 +185,8 @@ } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/SysCall.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/SysCall.java 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/SysCall.java 2008-09-29 03:06:44 UTC (rev 15024) @@ -60,7 +60,7 @@ // startup/shutdown @SysCallTemplate public abstract void sysExit(int value); - + @SysCallTemplate public abstract int sysArg(int argno, byte[] buf, int buflen); @@ -417,3 +417,9 @@ @SysCallTemplate public abstract int gcspySprintf(Address str, Address format, Address value); } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-29 03:06:44 UTC (rev 15024) @@ -440,10 +440,10 @@ _exit(EXIT_STATUS_DYING_WITH_UNCAUGHT_EXCEPTION); } - printf("got the lock\n"); #endif - printf("pthread = %p\n",pthread_self()); + if (lib_verbose) + fprintf(SysTraceFile,"hardwareTrapHandler: pthread = %p\n",pthread_self()); unsigned int localNativeThreadAddress; unsigned int localFrameAddress; @@ -478,7 +478,7 @@ if (isVmSignal(localInstructionAddress, localNativeThreadAddress)) { - printf("it's a VM signal.\n"); + if (lib_verbose) fprintf(SysTraceFile,"it's a VM signal.\n"); if (signo == SIGSEGV /*&& check the adddress TODO */) isRecoverable = 1; @@ -836,7 +836,9 @@ #if 0 pthread_mutex_unlock( &exceptionLock ); #endif - printf("exiting normally; the context will take care of the rest (or so we hope)\n"); + if (lib_verbose) + fprintf(SysTraceFile, + "exiting normally; the context will take care of the rest (or so we hope)\n"); } Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-29 00:38:10 UTC (rev 15023) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-29 03:06:44 UTC (rev 15024) @@ -252,6 +252,8 @@ static bool systemExiting = false; +static const bool debugging = true; + // Exit with a return code. // extern "C" void @@ -276,6 +278,9 @@ systemExiting = true; pthread_mutex_lock( &DeathLock ); + if (debugging && value!=0) { + abort(); + } exit(value); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-09-28 20:35:25
|
Revision: 15020 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15020&view=rev Author: pizlo Date: 2008-09-28 20:35:18 +0000 (Sun, 28 Sep 2008) Log Message: ----------- Fixed the simply StickyMS deadlock, but still have one in lusearch. ConcMS is still deadlocking. Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Lock.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/PageResource.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/RunBootImage.C rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Lock.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Lock.java 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Lock.java 2008-09-28 20:35:18 UTC (rev 15020) @@ -81,6 +81,7 @@ private int state; // Diagnosis Instance fields + @Untraced private RVMThread thread; // if locked, who locked it? private int where = -1; // how far along has the lock owner progressed? Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/PageResource.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/PageResource.java 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/PageResource.java 2008-09-28 20:35:18 UTC (rev 15020) @@ -15,6 +15,7 @@ import org.mmtk.plan.Plan; import org.mmtk.policy.Space; import org.mmtk.utility.Constants; +import org.mmtk.utility.Log; import org.mmtk.utility.options.ProtectOnRelease; import org.mmtk.utility.options.Options; @@ -319,3 +320,9 @@ mutatorLock.release(); } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/sanitychecker/SanityCheckerLocal.java 2008-09-28 20:35:18 UTC (rev 15020) @@ -168,17 +168,21 @@ if (global().preGCSanity()) return SanityChecker.UNSURE; - Log.write("checking object = "); - Log.write(object); - Log.writeln(); + if (false) { + Log.write("checking object = "); + Log.write(object); + Log.writeln(); + } Space space = Space.getSpaceForObject(object); - Log.write("space = "); - Log.write(ObjectReference.fromObject(space)); - Log.writeln(); - - VM.objectModel.dumpObject(object); + if (false) { + Log.write("space = "); + Log.write(ObjectReference.fromObject(space)); + Log.writeln(); + + VM.objectModel.dumpObject(object); + } return space.isReachable(object) ? SanityChecker.ALIVE : SanityChecker.DEAD; } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/RuntimeEntrypoints.java 2008-09-28 20:35:18 UTC (rev 15020) @@ -1023,6 +1023,9 @@ if (VM.TraceExceptionDelivery) { VM.sysWriteln("RuntimeEntrypoints.deliverException() entered; just got an exception object."); } + + //VM.sysWriteln("throwing exception!"); + //RVMThread.dumpStack(); // walk stack and look for a catch block // Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/RunBootImage.C =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/RunBootImage.C 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/RunBootImage.C 2008-09-28 20:35:18 UTC (rev 15020) @@ -407,6 +407,9 @@ ++argv, --argc; initialHeapSize = heap_default_initial_size; maximumHeapSize = heap_default_maximum_size; + + setvbuf(stdout,NULL,_IONBF,0); + setvbuf(stderr,NULL,_IONBF,0); /* * Debugging: print out command line arguments. Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-09-28 20:35:18 UTC (rev 15020) @@ -420,6 +420,8 @@ #endif // RVM_WITH_ALIGNMENT_CHECKING unsigned int localInstructionAddress; + +#if 0 static pthread_mutex_t exceptionLock = PTHREAD_MUTEX_INITIALIZER; /* @@ -438,6 +440,11 @@ _exit(EXIT_STATUS_DYING_WITH_UNCAUGHT_EXCEPTION); } + printf("got the lock\n"); +#endif + + printf("pthread = %p\n",pthread_self()); + unsigned int localNativeThreadAddress; unsigned int localFrameAddress; unsigned int localJTOC = VmToc; @@ -453,6 +460,9 @@ localInstructionAddress = IA32_EIP(context); localNativeThreadAddress = IA32_ESI(context); + /* FOR DEBUG ONLY */ + instructionFollowing = getInstructionFollowing(localInstructionAddress); + // We are prepared to handle these kinds of "recoverable" traps: // // 1. SIGSEGV - a null object dereference of the form "obj[-fieldOffset]" @@ -468,6 +478,8 @@ if (isVmSignal(localInstructionAddress, localNativeThreadAddress)) { + printf("it's a VM signal.\n"); + if (signo == SIGSEGV /*&& check the adddress TODO */) isRecoverable = 1; @@ -613,6 +625,7 @@ { writeErr("invalid native thread address (not an address - high nibble %d)\n", vp_hn); + abort(); signal(signo, SIG_DFL); raise(signo); // We should never get here. @@ -634,6 +647,7 @@ writeErr("invalid frame address %x" " (not an address - high nibble %d)\n", localFrameAddress, fp_hn); + abort(); signal(signo, SIG_DFL); raise(signo); // We should never get here. @@ -701,7 +715,9 @@ IA32_EIP(context) = dumpStack; *vmr_inuse = false; +#if 0 pthread_mutex_unlock( &exceptionLock ); +#endif return; } @@ -817,7 +833,10 @@ /* setup to return to deliver hardware exception routine */ IA32_EIP(context) = javaExceptionHandlerAddress; +#if 0 pthread_mutex_unlock( &exceptionLock ); +#endif + printf("exiting normally; the context will take care of the rest (or so we hope)\n"); } Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-26 05:27:04 UTC (rev 15019) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/sys.C 2008-09-28 20:35:18 UTC (rev 15020) @@ -892,10 +892,11 @@ { /* install a stack for hardwareTrapHandler() to run on */ stack_t stack; + char *stackBuf; memset (&stack, 0, sizeof stack); - stack.ss_sp = new char[SIGSTKSZ]; - + stack.ss_sp = stackBuf = new char[SIGSTKSZ]; + stack.ss_flags = 0; stack.ss_size = SIGSTKSZ; if (sigaltstack (&stack, 0)) { fprintf(stderr,"sigaltstack failed (errno=%d)\n",errno); @@ -909,6 +910,10 @@ // this is where we come to terminate the thread free(jb); *(int*)(tr + RVMThread_execStatus_offset) = RVMThread_TERMINATED; + + stack.ss_flags = SS_DISABLE; + sigaltstack(&stack, 0); + delete[] stackBuf; } else { pthread_setspecific(TerminateJmpBufKey, jb); This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-10-04 22:59:56
|
Revision: 15047 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15047&view=rev Author: pizlo Date: 2008-10-04 22:58:54 +0000 (Sat, 04 Oct 2008) Log Message: ----------- fixed parallel GC bug Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleCollector.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/listeners/EdgeListener.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/ThinLock.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -247,6 +247,9 @@ */ public final void prepareCollector(CollectorContext c) { RVMThread t = ((Selected.Collector) c).getThread(); + if (false) { + VM.sysWriteln("prepareCollector called for ",t.getThreadSlot()); + } int execStatus = t.execStatus; if (VM.VerifyAssertions) VM._assert(execStatus == RVMThread.IN_JAVA); Address fp = Magic.getFramePointer(); @@ -261,6 +264,10 @@ Atom cls = method.getDeclaringClass().getDescriptor(); Atom name = method.getName(); if (name == runAtom && cls == collectorThreadAtom) { + if (false) { + VM.sysWriteln("preparing GC thread ",RVMThread.getCurrentThreadSlot()," with ip = ",caller_ip); + VM.sysWriteln("preparing GC thread ",RVMThread.getCurrentThreadSlot()," with fp = ",caller_fp); + } t.contextRegisters.setInnermost(caller_ip, caller_fp); break; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/ScanThread.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -231,6 +231,9 @@ * performing the scan. */ private void scanThreadInternal(Address gprs, int verbosity) { + if (false) { + VM.sysWriteln("Scanning thread ",thread.getThreadSlot()," from thread ",RVMThread.getCurrentThreadSlot()); + } if (verbosity >= 1) { Log.writeln("--- Start Of Stack Scan ---\n"); Log.write("Thread #"); @@ -253,6 +256,9 @@ fp -> frame for method invocation being processed ip -> instruction pointer in the method (normally a call site) */ while (Magic.getCallerFramePointer(fp).NE(ArchitectureSpecific.StackframeLayoutConstants.STACKFRAME_SENTINEL_FP)) { + if (false) { + VM.sysWriteln("Thread ",RVMThread.getCurrentThreadSlot()," at fp = ",fp); + } prevFp = scanFrame(verbosity); ip = Magic.getReturnAddress(fp); fp = Magic.getCallerFramePointer(fp); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -410,6 +410,12 @@ private static boolean processPhaseStack(boolean resume) { int order = VM.collection.rendezvous(1001); final boolean primary = order == 1; + + if (false && primary) { + Log.write("thread "); + Log.write(VM.activePlan.mutator().getId()); + Log.writeln(" claims to be primary!"); + } boolean log = Options.verbose.getValue() >= 6; boolean logDetails = Options.verbose.getValue() >= 7; @@ -441,6 +447,10 @@ /* The main phase execution loop */ int scheduledPhase; while((scheduledPhase = getCurrentPhase(isEvenPhase)) > 0) { + if (false) { + Log.write("got scheduled phase for thread "); + Log.writeln(VM.activePlan.mutator().getId()); + } short schedule = getSchedule(scheduledPhase); short phaseId = getPhaseId(scheduledPhase); Phase p = getPhase(phaseId); @@ -458,7 +468,9 @@ } if (log) { - Log.write("Execute "); + Log.write("in thread "); + Log.write(VM.activePlan.mutator().getId()); + Log.write(" Execute "); p.logPhase(); } @@ -466,21 +478,27 @@ switch (schedule) { /* Global phase */ case SCHEDULE_GLOBAL: { - if (logDetails) Log.writeln(" as Global..."); + if (logDetails) { + Log.writeln(" as Global..."); + } if (primary) plan.collectionPhase(phaseId); break; } /* Collector phase */ case SCHEDULE_COLLECTOR: { - if (logDetails) Log.writeln(" as Collector..."); + if (logDetails) { + Log.writeln(" as Collector..."); + } collector.collectionPhase(phaseId, primary); break; } /* Mutator phase */ case SCHEDULE_MUTATOR: { - if (logDetails) Log.writeln(" as Mutator..."); + if (logDetails) { + Log.writeln(" as Mutator..."); + } /* Iterate through all mutator contexts */ MutatorContext mutator; while ((mutator = VM.activePlan.getNextMutator()) != null) { @@ -497,7 +515,9 @@ /* Concurrent phase */ case SCHEDULE_CONCURRENT: { /* We are yielding to a concurrent collection phase */ - if (logDetails) Log.writeln(" as Concurrent, yielding..."); + if (logDetails) { + Log.writeln(" as Concurrent, yielding..."); + } if (primary) { concurrentPhaseId = phaseId; scheduleConcurrentWorkers(); @@ -522,6 +542,11 @@ /* Set the next phase by processing the stack */ int next = getNextPhase(); boolean needsResetRendezvous = (next > 0) && (schedule == SCHEDULE_MUTATOR && getSchedule(next) == SCHEDULE_MUTATOR); + if (false) { + Log.write("setting phase in thread "); + Log.writeln(VM.activePlan.mutator().getId()); + } + setNextPhase(isEvenPhase, next, needsResetRendezvous); } @@ -548,10 +573,15 @@ stopComplexTimer = 0; } } - + /* Flip the even / odd phase sense */ isEvenPhase = !isEvenPhase; resume = false; + + if (false) { + Log.write("getting scheduled phase for thread "); + Log.writeln(VM.activePlan.mutator().getId()); + } } /* Phase stack exhausted so we return true */ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Plan.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -348,6 +348,18 @@ * @return True if we have run out of heap space. */ public final boolean lastCollectionFailed() { + if (false) { + Log.write("in thread "); + Log.write(VM.activePlan.mutator().getId()); + Log.write(" collection trigger = "); + Log.write(collectionTrigger); + Log.write(", getPagesAvail = "); + Log.write(getPagesAvail()); + Log.write(", getHeapFullThreshold = "); + Log.write(getHeapFullThreshold()); + Log.write(", requiredAtStart = "); + Log.writeln(requiredAtStart); + } return !(collectionTrigger == Collection.EXTERNAL_GC_TRIGGER || collectionTrigger == Collection.INTERNAL_PHASE_GC_TRIGGER) && (getPagesAvail() < getHeapFullThreshold() || getPagesAvail() < requiredAtStart); Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleCollector.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleCollector.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/SimpleCollector.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -175,3 +175,9 @@ return sanityChecker; } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/listeners/EdgeListener.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/listeners/EdgeListener.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/listeners/EdgeListener.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -193,9 +193,9 @@ // that we're actually not supposed to take the sample at all (the system // is in the process of activating our organizer and processing the buffer). if (idx < buffer.length) { - buffer[idx + 0] = calleeCMID; buffer[idx + 1] = callerCMID; buffer[idx + 2] = callSite.toInt(); + buffer[idx + 0] = calleeCMID; // If we are the last sample, we need to activate the organizer. if (sampleNumber + 1 == desiredSamples) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -120,8 +120,10 @@ // Install the edge listener if (Controller.options.cgTimer()) { + VM.sysWriteln("installing timer contex listener"); RuntimeMeasurements.installTimerContextListener((EdgeListener) listener); } else if (Controller.options.cgCBS()) { + VM.sysWriteln("installing CBS contex listener"); RuntimeMeasurements.installCBSContextListener((EdgeListener) listener); } else { if (VM.VerifyAssertions) VM._assert(false, "Unexpected value of call_graph_listener_trigger"); @@ -136,8 +138,20 @@ void thresholdReached() { if (DEBUG) VM.sysWriteln("DCG_Organizer.thresholdReached()"); + if (false) { + VM.sysWriteln("Dumping buffer in thresholdReached:"); + for (int i=0;i<bufferSize;++i) { + VM.sysWriteln(buffer[i]); + } + } + for (int i = 0; i < bufferSize; i = i + 3) { - int calleeCMID = buffer[i + 0]; + int calleeCMID=0; + // PMT: this is retarded beyond anything I've ever done. + while (calleeCMID==0) { + calleeCMID = buffer[i + 0]; + } + CompiledMethod compiledMethod = CompiledMethods.getCompiledMethod(calleeCMID); if (compiledMethod == null) continue; RVMMethod callee = compiledMethod.getMethod(); @@ -246,3 +260,9 @@ return thresholdReachedCount == 0; } } + +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/compilers/common/CompiledMethod.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -208,7 +208,7 @@ int max = (instructions.length() + 1) << ArchitectureSpecific.ArchConstants.LG_INSTRUCTION_WIDTH; if (!offset.toWord().LT(Word.fromIntZeroExtend(max))) { Address instructionStart = Magic.objectAsAddress(instructions); - VM.sysWriteln("\ngetInstructionOffset: ip is not within compiled code for method"); + VM.sysWriteln("\nIn thread ",RVMThread.getCurrentThreadSlot()," getInstructionOffset: ip is not within compiled code for method: ",ip); VM.sysWrite("\tsupposed method is "); VM.sysWrite(method); VM.sysWriteln(); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/Barrier.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -14,6 +14,7 @@ import org.jikesrvm.VM; import org.jikesrvm.scheduler.HeavyCondLock; +import org.jikesrvm.scheduler.RVMThread; import org.vmmagic.pragma.Uninterruptible; import org.vmmagic.pragma.Interruptible; @@ -31,6 +32,7 @@ private HeavyCondLock lock; private int target; private int[] counters=new int[2]; // are two counters enough? + private int[] modes=new int[2]; private int countIdx; public Barrier() {} @@ -42,15 +44,30 @@ countIdx=0; } - public boolean arrive() { + public boolean arrive(int mode) { + if (false) { + VM.sysWriteln("thread ",RVMThread.getCurrentThreadSlot(), + " entered ",RVMThread.getCurrentThread().barriersEntered++, + " barriers"); + } lock.lock(); int myCountIdx=countIdx; boolean result; + if (VM.VerifyAssertions) { + if (counters[myCountIdx]==0) { + modes[myCountIdx]=mode; + } else { + VM._assert(modes[myCountIdx]==mode); + } + } counters[myCountIdx]++; if (counters[myCountIdx]==target) { counters[myCountIdx]=0; countIdx^=1; lock.broadcast(); + if (false) { + VM.sysWriteln("waking everyone"); + } result=true; } else { while (counters[myCountIdx]!=0) { @@ -59,6 +76,11 @@ result=false; } lock.unlock(); + if (false) { + VM.sysWriteln("thread ",RVMThread.getCurrentThreadSlot(), + " exited ",RVMThread.getCurrentThread().barriersExited++, + " barriers"); + } return result; } } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/CollectorThread.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -409,7 +409,7 @@ * non-participants */ if (verbose >= 2) VM.sysWriteln("GC Message: CT.run initializing rendezvous"); gcBarrier.startupRendezvous(); - do { + for (;;) { /* actually perform the GC... */ if (verbose >= 2) VM.sysWriteln("GC Message: CT.run starting collection"); Selected.Collector.get().collect(); // gc @@ -449,8 +449,10 @@ } startTime = Time.nanoTime(); + boolean cont=Selected.Plan.get().lastCollectionFailed() && !Plan.isEmergencyCollection(); gcBarrier.rendezvous(5201); - } while (Selected.Plan.get().lastCollectionFailed() && !Plan.isEmergencyCollection()); + if (!cont) break; + } if (gcOrdinal == GC_ORDINAL_BASE && !internalPhaseTriggered) { /* If the collection failed, we may need to throw OutOfMemory errors. Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/ConcurrentCollectorThread.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -135,7 +135,7 @@ running++; schedLock.unlock(); - if (barrier.arrive()) { + if (barrier.arrive(1)) { schedLock.lock(); triggerRun=false; schedLock.broadcast(); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/memorymanagers/mminterface/SynchronizationBarrier.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -49,7 +49,11 @@ @Uninterruptible public int rendezvous(int where) { - barrier.arrive(); + if (false) { + VM.sysWriteln("thread ",RVMThread.getCurrentThreadSlot()," rendezvousing at ",where); + } + + barrier.arrive(where); Magic.isync(); // so subsequent instructions won't see stale values @@ -79,7 +83,7 @@ } if (myNumber > 1) { - barrier.arrive(); // wait for designated guy to do his job + barrier.arrive(100); // wait for designated guy to do his job Magic.isync(); // so subsequent instructions won't see stale values if (verbose > 0) VM.sysWriteln("GC Message: startupRendezvous leaving as ", myNumber); return; // leave barrier @@ -90,7 +94,7 @@ if (verbose > 0) { VM.sysWriteln("GC Message: startupRendezvous numParticipating = ", numParticipating); } - barrier.arrive(); // all setup now complete and we can proceed + barrier.arrive(100); // all setup now complete and we can proceed Magic.sync(); // update main memory so other processors will see it in "while" loop Magic.isync(); // so subsequent instructions won't see stale values if (verbose > 0) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -88,6 +88,7 @@ protected static final boolean traceBlock = false; /** Trace when a thread is really blocked */ protected static final boolean traceReallyBlock = false || traceBlock; + protected static final boolean dumpStackOnBlock = false; /** Trace thread start/stop */ protected static final boolean traceAcct = false; /** Trace execution */ @@ -272,6 +273,9 @@ * set. The converse also holds. */ private int disableGCDepth = 0; + + public int barriersEntered = 0; + public int barriersExited = 0; /** * Execution stack for this thread. @@ -1038,6 +1042,8 @@ } if (traceAcct) { VM.sysWriteln("Thread #",threadSlot," at ",Magic.objectAsAddress(this)); + VM.sysWriteln("stack at ",Magic.objectAsAddress(stack)," up to ", + Magic.objectAsAddress(stack).plus(stack.length)); } } @@ -1292,7 +1298,12 @@ break; } - if (traceReallyBlock) VM.sysWriteln("Thread #",threadSlot," is really blocked with status ",execStatus); + if (traceReallyBlock) { + VM.sysWriteln("Thread #",threadSlot," is really blocked with status ",execStatus); + if (dumpStackOnBlock) { + dumpStack(); + } + } // what if a GC request comes while we're here for a suspend() // request? Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/ThinLock.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/ThinLock.java 2008-10-03 14:26:22 UTC (rev 15046) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/ThinLock.java 2008-10-04 22:58:54 UTC (rev 15047) @@ -248,7 +248,8 @@ private static Lock inflate(Object o, Offset lockOffset) { if (VM.VerifyAssertions) { VM._assert(holdsLock(o, lockOffset, RVMThread.getCurrentThread())); - VM._assert((Magic.getWordAtOffset(o, lockOffset).and(TL_FAT_LOCK_MASK).isZero())); + // this assertions is just plain wrong. + //VM._assert((Magic.getWordAtOffset(o, lockOffset).and(TL_FAT_LOCK_MASK).isZero())); } Lock l = Lock.allocate(); if (VM.VerifyAssertions) { This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-10-05 21:26:22
|
Revision: 15048 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15048&view=rev Author: pizlo Date: 2008-10-05 21:26:17 +0000 (Sun, 05 Oct 2008) Log Message: ----------- stuff Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/MarkSweepSpace.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/MarkSweepSpace.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2008-10-04 22:58:54 UTC (rev 15047) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/MarkSweepSpace.java 2008-10-05 21:26:17 UTC (rev 15048) @@ -207,7 +207,7 @@ /** * A new collection increment has completed. For the mark-sweep * collector this means we can perform the sweep phase. - */ + */ public void release() { sweepConsumedBlocks(!EAGER_MARK_CLEAR); inMSCollection = false; Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java 2008-10-04 22:58:54 UTC (rev 15047) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java 2008-10-05 21:26:17 UTC (rev 15048) @@ -431,8 +431,10 @@ * @return The address of the new discontiguous space. */ public Address growDiscontiguousSpace(int chunks) { - this.lastDiscontiguousRegion = Map.allocateContiguousChunks(descriptor, this, chunks, lastDiscontiguousRegion); - return lastDiscontiguousRegion; + Map.lock.acquire(); + Address result=this.lastDiscontiguousRegion = Map.allocateContiguousChunks(descriptor, this, chunks, lastDiscontiguousRegion); + Map.lock.release(); + return result; } /** @@ -542,12 +544,17 @@ Log.writeln(); } else { Log.write("D ["); + int cnt=0; for(Address a = space.lastDiscontiguousRegion; a != Address.zero(); a = Map.getNextContiguousRegion(a)) { Log.write(a); Log.write("->"); Log.write(a.plus(Map.getContiguousRegionSize(a).minus(1))); if (Map.getNextContiguousRegion(a) != Address.zero()) Log.write(", "); + if (cnt++==10000) { + Log.writeln(); + VM.assertions.fail("more than 10000 regions; probably this means that something got corrupted."); + } } Log.writeln("]"); } @@ -692,3 +699,8 @@ return chunkAlign(rtn, false); } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-04 22:58:54 UTC (rev 15047) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-05 21:26:17 UTC (rev 15048) @@ -48,7 +48,7 @@ private static final FreeListPageResource[] sharedFLMap; private static int totalAvailableDiscontiguousChunks = 0; - private static Lock lock = VM.newLock("Map lock"); + public static Lock lock = VM.newLock("Map lock"); /**************************************************************************** * @@ -105,7 +105,8 @@ } /** - * Allocate some number of contiguous chunks within a discontiguous region + * Allocate some number of contiguous chunks within a discontiguous region. Note: you <b>must</b> + * acquire the Map.lock before calling. * * @param descriptor The descriptor for the space to which these chunks will be assigned * @param space The space to which these chunks will be assigned @@ -114,7 +115,10 @@ * @return The address of the assigned memory. This always succeeds. If the request fails we fail right here. */ public static Address allocateContiguousChunks(int descriptor, Space space, int chunks, Address previous) { - lock.acquire(); + Log.write("Map: allocating "); + Log.write(chunks<<Space.LOG_BYTES_IN_CHUNK); + Log.write(" bytes for "); + Log.writeln(space.getName()); int chunk = regionMap.alloc(chunks); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(chunk != 0); if (chunk == -1) { @@ -129,7 +133,12 @@ Address rtn = reverseHashChunk(chunk); insert(rtn, Extent.fromIntZeroExtend(chunks<<Space.LOG_BYTES_IN_CHUNK), descriptor, space); linkageMap[chunk] = previous.isZero() ? 0 : hashAddress(previous); - lock.release(); + + Log.write("Map: allocated "); + Log.write(getContiguousRegionSize(rtn)); + Log.write(" bytes for "); + Log.writeln(space.getName()); + return rtn; } @@ -225,23 +234,23 @@ public static void finalizeStaticSpaceMap() { /* establish bounds of discontiguous space */ Address startAddress = Space.getDiscontigStart(); - int start = hashAddress(startAddress); - int end = hashAddress(Space.getDiscontigEnd()); - int pages = (end - start)*Space.PAGES_IN_CHUNK + 1; + int first = hashAddress(startAddress); + int last = hashAddress(Space.getDiscontigEnd().minus(1)); + int pages = (1 + last - first)*Space.PAGES_IN_CHUNK + 1; globalPageMap.resizeFreeList(pages, pages); for (int pr = 0; pr < sharedDiscontigFLCount; pr++) sharedFLMap[pr].resizeFreeList(startAddress); /* set up the region map free list */ - regionMap.alloc(start); // block out entire bottom of address range - for (int chunk = start; chunk < end; chunk++) + regionMap.alloc(first); // block out entire bottom of address range + for (int chunk = first; chunk <= last; chunk++) regionMap.alloc(1); // tentitively allocate all usable chunks - regionMap.alloc(Space.MAX_CHUNKS - end); // block out entire top of address range + regionMap.alloc(Space.MAX_CHUNKS - last); // block out entire top of address range /* set up the global page map and place chunks on free list */ int firstPage = 0; - for (int chunk = start; chunk < end; chunk++) { - if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(VM.barriers.getArrayNoBarrier(spaceMap, chunk) == null); + for (int chunk = first; chunk <= last; chunk++) { + if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(spaceMap[chunk] == null); totalAvailableDiscontiguousChunks++; regionMap.free(chunk); // put this chunk on the free list globalPageMap.setUncoalescable(firstPage); @@ -294,7 +303,6 @@ */ @Inline public static int getDescriptorForAddress(Address object) { - if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(!object.isZero()); int index = hashAddress(object); return descriptorMap[index]; } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-04 22:58:54 UTC (rev 15047) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-05 21:26:17 UTC (rev 15048) @@ -87,10 +87,10 @@ /** Trace thread blockage */ protected static final boolean traceBlock = false; /** Trace when a thread is really blocked */ - protected static final boolean traceReallyBlock = false || traceBlock; + protected static final boolean traceReallyBlock = true || traceBlock; protected static final boolean dumpStackOnBlock = false; /** Trace thread start/stop */ - protected static final boolean traceAcct = false; + protected static final boolean traceAcct = true; /** Trace execution */ protected static final boolean trace = false; /** Trace thread termination */ Modified: rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-10-04 22:58:54 UTC (rev 15047) +++ rvmroot/branches/RVM-PureNativeThread/working/tools/bootImageRunner/ia32/libvm.c 2008-10-05 21:26:17 UTC (rev 15048) @@ -498,7 +498,7 @@ else writeErr("%s: WHOOPS. Got a signal (%s; #%d) that the hardware signal handler wasn't prepared for.\n", Me, strsignal(signo), signo); } else { - writeErr("%s: TROUBLE. Got a signal (%s; #%d) from outside the VM's address space.\n", Me, strsignal(signo), signo); + writeErr("%s: TROUBLE. Got a signal (%s; #%d) from outside the VM's address space in thread %p.\n", Me, strsignal(signo), signo, pthread_self()); } This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-10-08 19:41:01
|
Revision: 15085 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15085&view=rev Author: pizlo Date: 2008-10-08 19:40:52 +0000 (Wed, 08 Oct 2008) Log Message: ----------- debug stuff, and fix to bad controller startup synchronization Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java Added Paths: ----------- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/SoftLatch.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-10-08 19:20:59 UTC (rev 15084) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/plan/Phase.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -16,6 +16,7 @@ import org.mmtk.utility.Log; import org.mmtk.utility.options.Options; import org.mmtk.utility.statistics.Timer; +import org.mmtk.policy.Space; import org.mmtk.vm.Collection; import org.mmtk.vm.Lock; import org.mmtk.vm.VM; @@ -481,7 +482,15 @@ if (logDetails) { Log.writeln(" as Global..."); } - if (primary) plan.collectionPhase(phaseId); + if (primary) { + if (Options.verbose.getValue() >= 6) { + Space.printVMMap(); + } + plan.collectionPhase(phaseId); + if (Options.verbose.getValue() >= 6) { + Space.printVMMap(); + } + } break; } Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java 2008-10-08 19:20:59 UTC (rev 15084) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/policy/Space.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -468,7 +468,13 @@ */ public int releaseDiscontiguousChunks(Address chunk) { if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(chunk.EQ(chunkAlign(chunk, true))); - return Map.freeContiguousChunks(chunk); + Map.lock.acquire(); + if (chunk.EQ(lastDiscontiguousRegion)) { + lastDiscontiguousRegion = Map.getNextContiguousRegion(chunk); + } + int result=Map.freeContiguousChunks(chunk); + Map.lock.release(); + return result; } /** @@ -547,8 +553,13 @@ int cnt=0; for(Address a = space.lastDiscontiguousRegion; a != Address.zero(); a = Map.getNextContiguousRegion(a)) { - Log.write(a); Log.write("->"); - Log.write(a.plus(Map.getContiguousRegionSize(a).minus(1))); + Log.write(a); + Log.write("->"); + Extent regionSize=Map.getContiguousRegionSize(a); + Log.write(a.plus(regionSize.minus(1))); + Log.write(" (size = "); + Log.write(regionSize); + Log.write(")"); if (Map.getNextContiguousRegion(a) != Address.zero()) Log.write(", "); if (cnt++==10000) { Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-08 19:20:59 UTC (rev 15084) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -137,7 +137,9 @@ Log.write("Map: allocated "); Log.write(getContiguousRegionSize(rtn)); Log.write(" bytes for "); - Log.writeln(space.getName()); + Log.write(space.getName()); + Log.write(", returning "); + Log.writeln(rtn); return rtn; } @@ -195,16 +197,15 @@ } /** - * Free some set of contiguous chunks, given the chunk address + * Free some set of contiguous chunks, given the chunk address. Call this + * after acquiring the Map.lock. * * @param start The start address of the first chunk in the series * @return The number of chunks which were contiguously allocated */ public static int freeContiguousChunks(Address start) { - lock.acquire(); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(start.EQ(Space.chunkAlign(start, true))); int rtn = freeContiguousChunks(hashAddress(start)); - lock.release(); return rtn; } @@ -215,6 +216,9 @@ * @return The number of chunks freed */ private static int freeContiguousChunks(int chunk) { + Log.write("Map: freed "); + Log.writeln(reverseHashChunk(chunk)); + int chunks = regionMap.free(chunk); totalAvailableDiscontiguousChunks += chunks; for (int offset = 0; offset < chunks; offset++) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java 2008-10-08 19:20:59 UTC (rev 15084) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/Controller.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -32,6 +32,7 @@ import org.jikesrvm.compilers.baseline.EdgeCounts; import org.jikesrvm.compilers.common.RecompilationManager; import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.scheduler.SoftLatch; /** * This class contains top level adaptive compilation subsystem functions. @@ -249,14 +250,12 @@ // Create the ControllerThread static void createControllerThread() { - Object sentinel = new Object(); + SoftLatch sentinel = new SoftLatch(false); ControllerThread tt = new ControllerThread(sentinel); tt.start(); // wait until controller threads are up and running. try { - synchronized (sentinel) { - sentinel.wait(); - } + sentinel.waitAndClose(); } catch (Exception e) { e.printStackTrace(); VM.sysFail("Failed to start up controller subsystem"); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-10-08 19:20:59 UTC (rev 15084) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -31,6 +31,7 @@ import org.jikesrvm.adaptive.util.AOSLogging; import org.jikesrvm.adaptive.util.AOSOptions; import org.jikesrvm.scheduler.RVMThread; +import org.jikesrvm.scheduler.SoftLatch; import org.vmmagic.pragma.NonMoving; /** @@ -50,13 +51,13 @@ * constructor * @param sentinel An object to signal when up and running */ - ControllerThread(Object sentinel) { + ControllerThread(SoftLatch sentinel) { super("ControllerThread"); this.sentinel = sentinel; makeDaemon(true); } - private final Object sentinel; + private final SoftLatch sentinel; /** * There are several ways in which a dcg organizer might @@ -70,6 +71,8 @@ * the controllerThread is created. */ public void run() { + VM.sysWriteln("in ControllerThread.run!"); + // save this object so others can access it, if needed Controller.controllerThread = this; @@ -162,15 +165,16 @@ // Now that we're done initializing, Schedule all the organizer threads // and signal the sentinel object. private void controllerInitDone() { + VM.sysWriteln("controller init done!!"); for (Enumeration<Organizer> e = Controller.organizers.elements(); e.hasMoreElements();) { Organizer o = e.nextElement(); o.start(); } + VM.sysWriteln("doing notification!!"); + try { - synchronized (sentinel) { - sentinel.notify(); - } + sentinel.open(); } catch (Exception e) { e.printStackTrace(); VM.sysFail("Failed to start up controller subsystem"); @@ -277,3 +281,8 @@ } } +/* +Local Variables: + c-basic-offset: 2 +End: +*/ Added: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/SoftLatch.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/SoftLatch.java (rev 0) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/SoftLatch.java 2008-10-08 19:40:52 UTC (rev 15085) @@ -0,0 +1,94 @@ +/* + * This file is part of the Jikes RVM project (http://jikesrvm.org). + * + * This file is licensed to You under the Common Public License (CPL); + * You may not use this file except in compliance with the License. You + * may obtain a copy of the License at + * + * http://www.opensource.org/licenses/cpl1.0.php + * + * See the COPYRIGHT.txt file distributed with this work for information + * regarding copyright ownership. + */ +package org.jikesrvm.scheduler; + +import org.vmmagic.pragma.Uninterruptible; + +/** + * An implementation of a latch using monitors. + * This essentially gives you park/unpark functionality. It can also + * be used like the Win32-style AutoResetEvent or ManualResetEvent. + * <p> + * Park/unpark example: use open() to unpark and waitAndClose() to park. + * <p> + * AutoResetEvent example: use open() to set, close() to reset, and + * waitAndClose() to wait. + * <p> + * ManualResetEvent example: use open() to set, close() to reset, and + * wait() to wait. + * <p> + * Note: <b><i>never</i></b> synchronize on instances of this class. + */ +public class SoftLatch { + + private boolean open; + + /** Create a new latch, with the given open/closed state. */ + public SoftLatch(boolean open) { + this.open = open; + } + + /** + * Open the latch and let all of the thread(s) waiting on it through. + * But - if any of the threads is using waitAndClose(), then as soon + * as that thread awakes further threads will be blocked. + */ + public synchronized void open() { + open=true; + notifyAll(); + } + + /** + * Close the latch, causing future calls to wait() or waitAndClose() + * to block. + */ + public synchronized void close() { + open=false; + } + + /** + * Wait for the latch to become open. If it is already open, don't + * wait at all. + */ + public synchronized void await() { + while (!open) { + try { + wait(); + } catch (InterruptedException e) { + throw new Error(e); + } + } + } + + /** + * Wait for the latch to become open, and then close it and return. + * If the latch is already open, don't wait at all, just close it + * immediately and return. + */ + public synchronized void waitAndClose() { + while (!open) { + try { + wait(); + } catch (InterruptedException e) { + throw new Error(e); + } + } + open=false; + } +} + +/* For the emacs weenies in the crowd. +Local Variables: + c-basic-offset: 2 +End: +*/ This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |
From: <pi...@us...> - 2008-10-10 00:45:11
|
Revision: 15089 http://jikesrvm.svn.sourceforge.net/jikesrvm/?rev=15089&view=rev Author: pizlo Date: 2008-10-10 00:45:01 +0000 (Fri, 10 Oct 2008) Log Message: ----------- confirmed that the nasty memory layout bug is fixed, removed debug garbage Modified Paths: -------------- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/StackframeLayoutConstants.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/ia32/JNICompiler.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/ext/vm/jikesrvm/org/jikesrvm/mm/mmtk/Collection.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -228,7 +228,14 @@ RVMThread t = ((Selected.Mutator) m).getThread(); t.monitor().lock(); int execStatus = t.execStatus; + VM._assert(execStatus != RVMThread.IN_JNI); + VM._assert(execStatus != RVMThread.IN_NATIVE); if (execStatus == RVMThread.BLOCKED_IN_JNI) { + + if (false) { + VM.sysWriteln("for thread #",t.getThreadSlot()," setting up JNI stack scan"); + VM.sysWriteln("thread #",t.getThreadSlot()," has top java fp = ",t.jniEnv.topJavaFP()); + } /* thread is blocked in C for this GC. Its stack needs to be scanned, starting from the "top" java Modified: rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/MMTk/src/org/mmtk/utility/heap/Map.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -115,10 +115,12 @@ * @return The address of the assigned memory. This always succeeds. If the request fails we fail right here. */ public static Address allocateContiguousChunks(int descriptor, Space space, int chunks, Address previous) { - Log.write("Map: allocating "); - Log.write(chunks<<Space.LOG_BYTES_IN_CHUNK); - Log.write(" bytes for "); - Log.writeln(space.getName()); + if (false) { + Log.write("Map: allocating "); + Log.write(chunks<<Space.LOG_BYTES_IN_CHUNK); + Log.write(" bytes for "); + Log.writeln(space.getName()); + } int chunk = regionMap.alloc(chunks); if (VM.VERIFY_ASSERTIONS) VM.assertions._assert(chunk != 0); if (chunk == -1) { @@ -134,12 +136,14 @@ insert(rtn, Extent.fromIntZeroExtend(chunks<<Space.LOG_BYTES_IN_CHUNK), descriptor, space); linkageMap[chunk] = previous.isZero() ? 0 : hashAddress(previous); - Log.write("Map: allocated "); - Log.write(getContiguousRegionSize(rtn)); - Log.write(" bytes for "); - Log.write(space.getName()); - Log.write(", returning "); - Log.writeln(rtn); + if (false) { + Log.write("Map: allocated "); + Log.write(getContiguousRegionSize(rtn)); + Log.write(" bytes for "); + Log.write(space.getName()); + Log.write(", returning "); + Log.writeln(rtn); + } return rtn; } @@ -216,8 +220,10 @@ * @return The number of chunks freed */ private static int freeContiguousChunks(int chunk) { - Log.write("Map: freed "); - Log.writeln(reverseHashChunk(chunk)); + if (false) { + Log.write("Map: freed "); + Log.writeln(reverseHashChunk(chunk)); + } int chunks = regionMap.free(chunk); totalAvailableDiscontiguousChunks += chunks; Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/controller/ControllerThread.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -71,8 +71,6 @@ * the controllerThread is created. */ public void run() { - VM.sysWriteln("in ControllerThread.run!"); - // save this object so others can access it, if needed Controller.controllerThread = this; @@ -165,14 +163,11 @@ // Now that we're done initializing, Schedule all the organizer threads // and signal the sentinel object. private void controllerInitDone() { - VM.sysWriteln("controller init done!!"); for (Enumeration<Organizer> e = Controller.organizers.elements(); e.hasMoreElements();) { Organizer o = e.nextElement(); o.start(); } - VM.sysWriteln("doing notification!!"); - try { sentinel.open(); } catch (Exception e) { Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/adaptive/measurements/organizers/DynamicCallGraphOrganizer.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -120,10 +120,8 @@ // Install the edge listener if (Controller.options.cgTimer()) { - VM.sysWriteln("installing timer contex listener"); RuntimeMeasurements.installTimerContextListener((EdgeListener) listener); } else if (Controller.options.cgCBS()) { - VM.sysWriteln("installing CBS contex listener"); RuntimeMeasurements.installCBSContextListener((EdgeListener) listener); } else { if (VM.VerifyAssertions) VM._assert(false, "Unexpected value of call_graph_listener_trigger"); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/StackframeLayoutConstants.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/StackframeLayoutConstants.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/ia32/StackframeLayoutConstants.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -194,17 +194,17 @@ int STACK_SIZE_NORMAL = STACK_SIZE_GUARD + STACK_SIZE_GCDISABLED + - 200 * 1024; // initial stack space to allocate for normal thread (includes guard region) + 400 * 1024; // initial stack space to allocate for normal thread (includes guard region) int STACK_SIZE_BOOT = STACK_SIZE_GUARD + STACK_SIZE_GCDISABLED + - 20 * 1024; // total stack space to allocate for boot thread (includes guard region) + 40 * 1024; // total stack space to allocate for boot thread (includes guard region) int STACK_SIZE_COLLECTOR = STACK_SIZE_GUARD + STACK_SIZE_GCDISABLED + - 20 * 1024; // total stack space to allocate for collector thread (includes guard region) + 40 * 1024; // total stack space to allocate for collector thread (includes guard region) int STACK_SIZE_MAX = - STACK_SIZE_GUARD + STACK_SIZE_GCDISABLED + 200 * 1024; // upper limit on stack size (includes guard region) + STACK_SIZE_GUARD + STACK_SIZE_GCDISABLED + 400 * 1024; // upper limit on stack size (includes guard region) int STACK_SIZE_JNINATIVE_GROW = 0; // TODO!!; } Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/ia32/JNICompiler.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/ia32/JNICompiler.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/jni/ia32/JNICompiler.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -192,7 +192,7 @@ // reasons why the enterJNIBlockedMethod call above works. asm.emitCALL_Abs( Magic.getTocPointer().plus( - Entrypoints.leaveJNIBlockedMethod.getOffset())); + Entrypoints.leaveJNIBlockedFromCallIntoNativeMethod.getOffset())); // come here when done saying that we left JNI leftJNIRef.resolve(asm); @@ -829,7 +829,7 @@ // make the slow call asm.emitCALL_Abs( Magic.getTocPointer().plus( - Entrypoints.leaveJNIBlockedMethod.getOffset())); + Entrypoints.leaveJNIBlockedFromJNIFunctionCallMethod.getOffset())); // arrive here when we've switched to IN_JAVA doneLeaveJNIRef.resolve(asm); Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/runtime/Entrypoints.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -227,8 +227,10 @@ public static final NormalMethod enterJNIBlockedMethod = getMethod(org.jikesrvm.scheduler.RVMThread.class, "enterJNIBlocked", "()V"); - public static final NormalMethod leaveJNIBlockedMethod = - getMethod(org.jikesrvm.scheduler.RVMThread.class, "leaveJNIBlocked", "()V"); + public static final NormalMethod leaveJNIBlockedFromJNIFunctionCallMethod = + getMethod(org.jikesrvm.scheduler.RVMThread.class, "leaveJNIBlockedFromJNIFunctionCall", "()V"); + public static final NormalMethod leaveJNIBlockedFromCallIntoNativeMethod = + getMethod(org.jikesrvm.scheduler.RVMThread.class, "leaveJNIBlockedFromCallIntoNative", "()V"); public static final NormalMethod threadRunMethod = getMethod(org.jikesrvm.scheduler.RVMThread.class, "run", "()V"); public static final NormalMethod threadStartoffMethod = Modified: rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java =================================================================== --- rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-09 23:52:01 UTC (rev 15088) +++ rvmroot/branches/RVM-PureNativeThread/working/rvm/src/org/jikesrvm/scheduler/RVMThread.java 2008-10-10 00:45:01 UTC (rev 15089) @@ -87,10 +87,10 @@ /** Trace thread blockage */ protected static final boolean traceBlock = false; /** Trace when a thread is really blocked */ - protected static final boolean traceReallyBlock = true || traceBlock; - protected static final boolean dumpStackOnBlock = false; + protected static final boolean traceReallyBlock = false || traceBlock; + protected static final boolean dumpStackOnBlock = false; // DANGEROUS! can lead to crashes! /** Trace thread start/stop */ - protected static final boolean traceAcct = true; + protected static final boolean traceAcct = false; /** Trace execution */ protected static final boolean trace = false; /** Trace thread termination */ @@ -1300,6 +1300,7 @@ if (traceReallyBlock) { VM.sysWriteln("Thread #",threadSlot," is really blocked with status ",execStatus); + VM.sysWriteln("Thread #",threadSlot," has fp = ",Magic.getFramePointer()); if (dumpStackOnBlock) { dumpStack(); } @@ -1436,10 +1437,23 @@ } @Entrypoint - static final void leaveJNIBlocked() { - getCurrentThread().checkBlockNoSaveContext(); + static final void leaveJNIBlockedFromJNIFunctionCall() { + RVMThread t=getCurrentThread(); + if (traceReallyBlock) { + VM.sysWriteln("Thread #",t.getThreadSlot()," in leaveJNIBlockedFromJNIFunctionCall"); + } + t.checkBlockNoSaveContext(); } + @Entrypoint + static final void leaveJNIBlockedFromCallIntoNative() { + RVMThread t=getCurrentThread(); + if (traceReallyBlock) { + VM.sysWriteln("Thread #",t.getThreadSlot()," in leaveJNIBlockedFromCallIntoNative"); + } + t.checkBlockNoSaveContext(); + } + private int setBlockedExecStatus() { Offset offset=Entrypoints.execStatusField.getOffset(); int oldState,newState; This was sent by the SourceForge.net collaborative development platform, the world's largest Open Source development site. |